18. 文件操作

18.1 文件打开模式:

open() 方法
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

完整的语法格式为:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener:

mode 参数有:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

默认为文本模式,如果要以二进制模式打开,加上 b 。

18.2 文件对象方法

方法 描述
fileObject.close() close() 方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作,否则会触发 ValueError 错误。 close() 方法允许调用多次。当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。 使用 close() 方法关闭文件是一个好的习惯。
fileObject.flush() flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
fileObject.fileno() fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
fileObject.isatty() isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。
next(iterator[,default]) Python 3 中的 File 对象不支持 next() 方法。 Python 3 的内置函数 next() 通过迭代器调用 next() 方法返回下一项。在循环中,next() 函数会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发 StopIteration。
fileObject.read() read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
fileObject.readline() readline() 方法用于从文件读取整行,包括 “ ” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “ ” 字符。
fileObject.readlines() readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。如果碰到结束符 EOF,则返回空字符串。
fileObject.seek(offset[, whence]) seek() 方法用于移动文件读取指针到指定位置。whence 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾。whence 值为默认为0,即文件开头。例如:seek(x, 0):从起始位置即文件首行首字符开始移动 x 个字符,seek(x, 1):表示从当前位置往后移动 x 个字符,seek(-x, 2):表示从文件的结尾往前移动 x 个字符
fileObject.tell(offset[, whence]) tell() 方法返回文件的当前位置,即文件指针当前位置。
fileObject.truncate([size]) truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
fileObject.write([str]) write() 方法用于向文件中写入指定字符串。在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。
fileObject.writelines([str]) writelines() 方法用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要指定换行符 。

实例

filename = 'data.log'  
# 打开文件(a+ 追加读写模式)  
# 用 with 关键字的方式打开文件,会自动关闭文件资源  
with open(filename, 'w+', encoding='utf-8') as file:  
 print('文件名称: {}'.format(file.name))  
 print('文件编码: {}'.format(file.encoding))  
 print('文件打开模式: {}'.format(file.mode))  
 print('文件是否可读: {}'.format(file.readable()))  
 print('文件是否可写: {}'.format(file.writable()))  
 print('此时文件指针位置为: {}'.format(file.tell()))  
 # 写入内容  
 num = file.write("第一行内容  
")  
 print('写入文件 {} 个字符'.format(num))  
 # 文件指针在文件尾部,故无内容  
 print(file.readline(), file.tell())  
 # 改变文件指针到文件头部  
 file.seek(0)  
 # 改变文件指针后,读取到第一行内容  
 print(file.readline(), file.tell())  
 # 但文件指针的改变,却不会影响到写入的位置  
 file.write('第二次写入的内容  
')  
 # 文件指针又回到了文件尾  
 print(file.readline(), file.tell())  
 # file.read() 从当前文件指针位置读取指定长度的字符  
 file.seek(0)  
 print(file.read(9))  
 # 按行分割文件,返回字符串列表  
 file.seek(0)  
 print(file.readlines())  
 # 迭代文件对象,一行一个元素  
 file.seek(0)  
 for line in file:  
 print(line, end='')  
# 关闭文件资源  
if not file.closed:  
 file.close()  

输出:

文件名称: data.log  
文件编码: utf-8  
文件打开模式: w+  
文件是否可读: True  
文件是否可写: True  
此时文件指针位置为: 0  
写入文件 6 个字符  
 16  
第一行内容  
 16  
 41  
第一行内容  
第二次  
['第一行内容  
', '第二次写入的内容  
']  
第一行内容  
第二次写入的内容  

发表回复

登录... 后才能评论