这篇文章将会介绍 Python 中文件及其相关操作
1、打开和关闭
要打开文件可以使用函数 open(file, mode)
,该函数返回一个文件对象
file
:必填参数,用于指定文件路径mode
:可选参数,用于指定文件模式,其可取值如下:
值 | 描述 |
'r' |
读取模式(默认值) |
'w' |
普通写入模式,当文件不存在时创建它,当文件存在时清除原有内容后继续写入 |
'a' |
附加写入模式,当文件不存在时创建它,当文件存在时在既有文件末尾继续写入 |
'x' |
独占写入模式,当文件不存在时创建它,当文件存在时会引发异常 |
't' |
文本模式 (与其它模式结合使用,默认值) |
'b' |
二进制模式(与其它模式结合使用) |
'+' |
读写模式 (与其它模式结合使用) |
要关闭文件可以使用文件对象的内置方法 close()
,该方法不返回任何值
需要注意的是,在把数据写入文件后,如果没有正确地关闭文件,则很可能不能成功写入数据
因为写入的数据是先保存在缓存区的,等文件关闭或缓冲区被刷新时才会将数据真正写入文件
f = open('fileName') # 打开文件,此时使用默认的文件模式 ‘rt’ f.close() # 关闭文件
为了避免这种情况的发生,我们可以使用 with
语句打开文件
若用 with
语句打开文件,那么当 with
语句块中的代码全部执行完毕后将自动关闭文件
with open('fileName') as f: # 打开文件 pass # 自动关闭文件
2、读取和写入
(1)按字符或字节读写
首先我们要清楚,在文本模式和二进制模式下,文件的传输类型分别是 str
以及 bytes
我们可以用文件对象的内置方法 write()
写入数据,该方法返回写入的字符长度
# 写入文本文件 textFile = open('TextFile', 'wt') textFile.write('Hello, ') # 7 textFile.write('World') # 5 textFile.close() # 写入字节文件 byteFile = open('ByteFile', 'wb') byteFile.write(str.encode('Hello, ')) # 7 byteFile.write(str.encode('World')) # 5 byteFile.close()
读取文件的方法也很简单,使用文件对象的内置方法 read()
即可
在文本模式下需要说明读取多少个字符,在二进制模式下需要说明读取多少个字节
# 读取文本文件 textFile = open('TextFile', 'rt') a = textFile.read(2) # 指定读取两个字符 b = textFile.read() # 若没有指定读取的字符数,则读取余下的所有字符 print(a) # He print(b) # llo, World # 读取字节文件 byteFile = open('ByteFile', 'rb') c = byteFile.read(2) # 指定读取两个字节 d = byteFile.read() # 若没有指定读取的字节数,则读取余下的所有字节 print(c.decode('utf-8')) # He print(d.decode('utf-8')) # llo, World
(2)按行读写
想要按行写入文件,可以使用文件对象的内置方法 writelines()
该方法接收一个字符串列表,然后将这些字符串依次写入文件,该方法在写入时并不会添加换行符
f = open('File', 'w') data = [ 'I love Python', 'I love the world' ] f.writelines([item + '\n' for item in data])
至于按行读取文件,可以使用文件对象的内置方法 readlines()
该方法与 writelines()
方法对应,一次读取文件中的所有行,并以列表的形式返回它们
f = open('File', 'r') data = f.readlines() print(data) # ['I love Python\n', 'I love the world\n']
此外我们还可以使用文件对象的内置方法 readline()
读取文件
当不提供任何参数时,读取一行并返回,当提供一个非负整数时,读取第一行中指定字符数并返回
f = open('File', 'r') line = f.readline() while line: print(line) line = f.readline() # I love Python # # I love the world #
f = open('File', 'r') line1 = f.readline(2) line2 = f.readline(20) print(line1) # I print(line2) # love Python
(3)迭代文件对象
f = open('File', 'r') for line in f: print(line) # I love Python # # I love the world #
3、随机存取
在之前的做法中,我们将文件视为数据流,按顺序从头到尾来读取
实际上读写可以在任意位置进行,这称为随机存储,为此我们要用到文件对象的两个方法:seek
和 tell
seek(offset, [whence])
:将文件指针移到指定的位置
参数offset
用于指定偏移的字符或字节数,参数whence
用于指定偏移的初始位置,其取值有三:0
表示文件开头 (默认值),1
表示当前位置,2
表示文件末尾tell()
:返回文件指针当前指向的位置
f = open('File', 'w') f.write('0123456789') # 10 f.seek(5) # 5 f.write('Hello') f.close() f = open('File', 'r') f.read() # 01234Hello f.close()
文章知识点与官方知识档案匹配,可进一步学习相关知识