第七章 使用python处理文件

数据的储存可以使用数据库,也可以使用文件。数据库的使用保持了数据的完整性和关联性,而且使数据更安全。使用文件储存数据则非常方便,不必安装数据库管理系统等运行环境。文件通常用于存储应用软件的参数或临时性数据。python提供了osos.path等模块处理文件。

7.1 文件的常见操作

文件通常用于储存数据或应用系统的参数。python提供了包括打开文件,读写文件,复制和删除文件等函数。

文件的打开或创建可以使用函数open()。该函数可以指定处理模式,设置打开的文件为只读,只写或读写状态。file类用于文件管理,可以对文件进行创创建,打开,读写,关闭等操作。文件的处理一般分为三个步骤:

  1. 创建并打开文件
  2. 调用file对象的read()write()等方法处理文件
  3. 调用close()关闭文件,释放file对象占用的资源

close()方法是必要的,虽然python提供了垃圾回收机制,清理不再使用的对象,但是手动释放不需要的资源是一种良好的习惯。同时也主动告诉python的垃圾回收器,该对象需要被清除。

这段代码演示了文件的创建,写入和关闭操作。

# 创建文件
context = '''hello world'''

f = open('hello.txt', 'w')          # 打开文件
f.write(context)                # 把字符串写入文件
f.close()                       # 关闭文件

文件的读取有很多方法,可以使用readline()readlines()或read()函数读取文件。

readline()每次读取文件中的一行,需要使用永真表达式(while True:)循环读取文件。但当文件指针移动到文件末尾时,依然使用readline()读取文件将会出现错误。所以在程序中需要加入一个判断句,判断指针是否移到了文件的尾部,并作出判断。

# 使用readline()读文件
f = open("hello.txt")
while True:
    line = f.readline()
    if line: 
        print (line)
    else:
        break
f.close()

使用readlines()读取文件,需要通过循环访问readlines()返回列表中的元素。函数readlines()可以一次性读取文件中的多行数据。

# 使用readlines()读文件
f = file('hello.txt')
lines = f.readlines()
for line in lines:              # 一次读取多行内容
    print (line)
f.close()

第3行代码调用readlines(),把文件hello.txt中所有的内容存储在列表lines中。

读取文件最简单的方法是使用read()read()将从文件中一次性读出所有内容,并赋值给1个字符串变量。

# 使用read()读文件
f = open("hello.txt")
context = f.read() 
print (context)
f.close()

可以通过控制read()参数的值,返回指定字节的内容。

f = open("hello.txt")
context = f.read(5)           # 读取文件前5个字节内容
print (context)
print (f.tell())                # 返回文件对象当前指针位置
context = f.read(5)          # 继续读取5个字节内容
print (context)
print (f.tell())               # 输出文件当前指针位置
f.close()

文件的写入有多种方法,可以使用write()writelines()方法。

# 使用writelines()写文件
f = file("hello.txt", "w+")
li = ["hello world\n", "hello China\n"]
f.writelines(li)
f.close()

如果需要保留文件中原有的内容,只是追加新的内容,可以使用模式“a+”打开文件。使用writelines()写文件的速度更快,如果需要写入的文件字符串非常多,可以使用writelines()提高效率。

文件的删除需要使用os模块和os.path模块。os模块提供了对系统环境,文件,目录等操作系统级的接口函数。文件的删除需要调用remove()函数实现,要删除文件之前需要判断文件是否存在,若存在则删除文件,否则不进行任何操作。

file类并没有提供直接复制文件的办法,但是可以使用read()write()方法,同样可以实现复制文件的功能。

# 使用read()、write()实现拷贝
# 创建文件hello.txt
src = file("hello.txt", "w")
li = ["hello world\n", "hello China\n"]
src.writelines(li) 
src.close()
# 把hello.txt拷贝到hello2.txt
src = open("hello.txt", "r") #只读模式打开
dst = open("hello2.txt", "w") #写入模式打开
dst.write(src.read()) #dst写入读取src的内容
src.close()
dst.close()

os模块的函数rename()可以对文件或目录进行重命名。下面这段代码实现的是如果当前目录存在名为hello.txt文件,则重命名为hi.txt,如果存在hi.txt文件,就重命名为hello.txt

# 修改文件名
import os   
li = os.listdir(".")
print (li)
if "hello.txt" in li:
    os.rename("hello.txt", "hi.txt") 
elif "hi.txt" in li:
    os.rename("hi.txt", "hello.txt")

其中第3行代码调用了listdir()返回当前目录的文件列表,“.”表示当前目录。

在实际应用中,需要把某一类文件修改为另外一种类型,也就是修改文件的后缀名,这种需求可以通过函数rename()和字符串查找的函数实现。

# 修改后缀名
import os  
files = os.listdir(".")
for filename in files:
    pos = filename.find(".")
    if filename[pos + 1:] == "html":
        newname = filename[:pos + 1] + "htm"
        os.rename(filename,newname)

pos + 1表示“.”后的位置,filename[:pos + 1]表示从filename的开头位置到“.”这段分片。

7.1 目录的常见操作

目录的创建和删除可以使用mkdir()makedirs()rmdir()removedirs()实现。

import os

os.mkdir("hello")
os.rmdir("hello")
os.makedirs("hello\world")
os.removedirs("hello\world")

第3行代码创建一个名为“hello”的目录;
第4行代码删除目录“hello”
第5行代码创建多级目录,先创建目录“hello”,再创建子目录“world”
第6行代码删除目录“hello”“world”

目录的遍历有两种实现方法,一种是递归函数,一种是os.walk()函数。

7.4 文件处理示例——文件属性浏览程序

我省略了 7.3 的学习,这部分是文件和流,因为这部分内容对我来说暂时有些难理解,所以先搁置一下。

7.4这部分是设计一个浏览文件属性的程序。通过给定的目录路径查看文件的名称,大小,创建时间,最后修改日期和最后访问时间。功能的实现大致分为三个步骤:

  1. 遍历path指定的目录,获取每个子目录的路径;
  2. 遍历子目录下的所有文件,并返回文件的属性列表;
  3. 分解属性列表,对属性列表的值进行格式化输出。

代码如下:

def showFileProperties(path):
    '''显示文件的属性。包括路径、大小、创建日期、最后修改时间,最后访问时间'''
    import time,os
    for root,dirs,files in os.walk(path,True):
        print ("位置:" + root)
        for filename in files:
            state = os.stat(os.path.join(root, filename))
            info = "文件名: " + filename + " " 
            info = info + "大小:" + ("%d" % state[-4]) + " "
            t = time.strftime("%Y-%m-%d %X", time.localtime(state[-1]))
            info = info + "创建时间:" + t + " "
            t = time.strftime("%Y-%m-%d %X", time.localtime(state[-2]))
            info = info + "最后修改时间:" + t + " "
            t = time.strftime("%Y-%m-%d %X", time.localtime(state[-3]))
            info = info + "最后访问时间:" + t + " "
            print (info)

if __name__ == "__main__":
    path = r"D:\developer\python\example\07\7.2.2"
    showFileProperties(path)

这段代码暂时还没有搞明白,因为马上要期末考试了,python只能先放一放。