python:文件的读取操作
open():打开文件函数
语法
使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:
open(file, mode='r', encoding=None, errors=None, newline=None, closefd=True, opener=None)
函数功能:打开文件并返回相应的文件对象。如果无法打开文件,则会引发 OSError 异常。
函数主要参数解释:
字符 | 含义 |
---|---|
'r' |
以只读方式打开文件。文件的指针会放在文件的开头,这是默认模式 |
'w' |
以写入模式打开文件。如果该文件存在,则打开文件,并从头开始编辑,原有内容会被删除;如果该文件不存在,则创建新文件 |
'x' |
以独占创建模式打开,如果文件已存在则失败 |
'a' |
以写入模式打开文件。如果文件存在,则在文件末尾追加内容;如果该文件不存在,则创建新文件进行写入 |
'b' |
二进制模式 |
't' |
文本模式(默认) |
'+' |
以更新模式打开(读写) |
默认模式是 'r'(以文本模式打开读取,等同于 'rt')。
Python 区分二进制和文本 I/O。以二进制模式打开的文件(在模式参数中包含 'b')返回的内容是bytes对象,不进行任何解码。在文本模式下(默认模式或在模式参数中包含 't'),文件内容作为 str 返回,字节首先使用平台相关的编码或指定的编码进行解码。
示例:打开文件
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
print(f'open函数返回的类型是:{type(f)}')
运行结果:
文件读操作:read()方法
语法
文件对象.read(size=-1)
从流中读取最多 size 个字符,并将其作为单个字符串返回。如果 size 为负数或 None,则一直读取到文件末尾(EOF)。
注意:如果多次调用read方法,后续的read会在前一次读取的末尾处接着读取的,而不是从头开始读取。
示例
示例:读取指定数量的字符
要被读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
# 读取10个字符
print(f'读取的10个字符是:{f.read(10)}')
运行结果:
示例:读取所有的内容
要读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
# 读取所有的内容
print(f'读取的内容是:{f.read()}')
运行结果:
示例:多次调用read方法
要读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
print(f'第1次读取的5个字符是:{f.read(5)}')
print(f'第2次读取的5个字符是:{f.read(5)}')
print(f'第3次读取的内容是:{f.read()}')
运行结果:
文件读操作:readline()方法
语法
文件对象.readline(size=-1)
读取直到换行符或文件末尾(EOF),并返回一个字符串。如果流已经到达 EOF,则返回空字符串。
如果指定了 size,最多将读取 size 个字符。
注意:是从文件指针的地方开始读取。如果前面读取了文件,例如使用read方法,那么指针就移动了,再用readline方法读取,是从指针的地方开始读取,而不是从文件的开头读取。
示例
要读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(f'第1行数据是:{line1}')
print(f'第2行数据是:{line2}')
print(f'第3行数据是:{line3}')
运行结果:
文件读操作:readlines()方法
语法
文件对象.readlines(hint=- 1)
从流中读取并返回一个行列表。可以通过 hint 参数控制读取的行数:如果到目前为止所有行的字节/字符总数超过 hint,则不再读取更多行。
hint 的值小于或等于 0,以及 None,都被视为没有提示。
请注意,已经可以使用 for line in file: … 迭代文件对象,而无需调用 file.readlines()。
注意:是从文件指针的地方开始读取。如果前面读取了文件,例如使用read方法,那么指针就移动了,再用readlines方法读取,是从指针的地方开始读取,而不是从文件的开头读取。
示例
示例:读取文件的所有行
要读取的文件:
读取操作 :
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
lines = f.readlines()
print(f'lines的类型是:{type(lines)}')
print(f'lines对象的内容是:{lines}')
运行结果:
for 循环读取文件行
示例:
要读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
for line in f:
print(f'读取的该行数据是:{line}')
运行结果:
文件关闭操作:close()方法
语法
close()
清空并关闭此流。如果文件已经关闭,则此方法无效。一旦文件关闭,对文件的任何操作(例如读取或写入)都会引发 ValueError 异常。
作为方便起见,允许多次调用此方法;但是,只有第一次调用才会生效。
示例
关闭文件后再读文件会导致出错
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
f = open('test.txt', 'r', encoding='UTF-8')
f.close()
# 关闭后再读文件会出错
f.readline()
运行结果:
with open语法
语法
with open('test.txt', 'r', encoding='UTF-8') as f:
# 对文件进行操作,例如f.readlines()
在 with open语句块中对文件进行操作,可以在操作完成后自动关闭文件,避免漏掉close方法。
示例
示例:读取文件
要读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
with open('test.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(line)
运行结果:
示例:在with open语句块之外再直接读取文件,会报错
下面示例中,在with open语句块之外调用 f.readlines()报错了,原因是with open语句块执行完毕后,文件已经关闭了。
要读取的文件:
读取操作:
# 打开文件
# 注意:为了演示,前两个参数使用了位置传参,而encoding并不是第3个参数,所以要使用关键字传参
with open('test.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(line)
# 现在读取会报错,因为文件已经关闭了
f.readlines()
运行结果:
作者:听海边涛声