Python3 文件读取详解
在 Python 中,文件操作是至关重要的技能。open()
函数是打开文件的关键,它会创建并返回一个文件对象。通过这个对象,我们可以对文件进行各种操作,例如读取内容。本教程将详细介绍如何使用文件对象进行顺序读取和随机读取,并提供清晰的代码示例,帮助你快速上手。
顺序读取:逐行逐字,步步为营
顺序读取是指按照文件中内容的先后顺序进行读取。Python 提供了三种主要方法来实现顺序读取:read()
,readline()
和 readlines()
。
1. read()
:一口吞,全盘读取
read(size=-1)
方法用于从文件中读取数据。
size
参数:指定要读取的字节数(二进制模式)或字符数(文本模式)。- 默认情况:如果
size
未指定或为负数,read()
会读取并返回文件的全部内容。
示例:
假设我们有一个名为 info.txt
的文件,内容如下(采用 UTF-8 编码):
你好 世界
谢谢
代码示例:
# 读取 3 个字符
with open('info.txt', 'r', encoding='utf-8') as f:
print(f.read(3))
# 读取 4 个字符
with open('info.txt', 'r', encoding='utf-8') as f:
print(f.read(4))
# 读取所有内容
with open('info.txt', 'r', encoding='utf-8') as f:
print(f.read())
输出结果:
你好
你好 世
你好 世界
谢谢
2. readline()
:细嚼慢咽,逐行读取
readline(size=-1)
方法用于从文件中读取一行内容。
size
参数:指定最多读取的字节数/字符数。如果未指定,则读取到行尾。- 返回值:返回包含行尾换行符
\n
的字符串。如果到达文件末尾,则返回空字符串''
。
示例:
使用与前面相同的 info.txt
文件。
代码示例:
# 读取最多 3 个字符
with open('info.txt', 'r', encoding='utf-8') as f:
print(repr(f.readline(3)))
# 读取第一行
with open('info.txt', 'r', encoding='utf-8') as f:
print(repr(f.readline()))
# 读取第二行
with open('info.txt', 'r', encoding='utf-8') as f:
f.readline() # 先读取第一行,指针后移
print(repr(f.readline()))
# 读取到文件末尾
with open('info.txt', 'r', encoding='utf-8') as f:
f.readline() # 先读取第一行,指针后移
f.readline() # 再读取第二行,指针后移
print(repr(f.readline()))
输出结果:
'你好 '
'你好 世界\n'
'谢谢'
''
使用 while
循环逐行读取:
由于 readline()
一次返回一行,我们可以使用 while
循环来逐行迭代文件内容。
with open('info.txt', 'r', encoding='utf-8') as f:
line = f.readline()
while line:
# 移除行尾的换行符和其他空白字符
line = line.strip()
print(line)
# 读取下一行
line = f.readline()
使用 for
循环逐行读取(推荐):
更简洁的方式是直接使用 for
循环迭代文件对象。这是 Python 中遍历文件的首选方式。
with open('info.txt', 'r', encoding='utf-8') as f:
for line in f:
# 移除行尾的换行符和其他空白字符
line = line.strip()
print(line)
输出结果:
你好 世界
谢谢
3. readlines()
:打包带走,一次性读取所有行
readlines()
方法返回一个包含文件中所有行的字符串列表,每行字符串都包含行尾的换行符。
注意: 对于大型文件,readlines()
可能会消耗大量内存,因此不建议使用。
示例:
使用与前面相同的 info.txt
文件。
代码示例:
with open('info.txt', 'r', encoding='utf-8') as f:
print(f.readlines())
输出结果:
['你好 世界\n', '谢谢']
随机读取:随心所欲,按需定位
随机读取允许我们直接访问文件中的特定位置,而无需从头开始逐行读取。Python 提供了 tell()
和 seek()
方法来实现随机读取。
1. tell()
:指点江山,告诉你当前位置
tell()
方法返回文件对象在文件中的当前位置(以字节为单位)。
示例:
假设我们仍然使用 info.txt
文件(UTF-8 编码,'你好 ' 占 7 个字节)。需要以二进制模式打开文件。
with open('info.txt', 'rb') as f: # 注意使用二进制模式 'rb'
f.read(7) # 读取 7 个字节
print(f.tell())
输出结果:
7
重要提示: 在文本模式下,tell()
返回的值可能不直接对应于字符数或字节数,因此随机访问通常在二进制模式下进行。
2. seek()
:乾坤挪移,定位到指定位置
seek(offset, reference=0)
方法用于将文件对象的当前位置移动到相对于 reference
偏移 offset
个字节的位置。
offset
参数:偏移量(以字节为单位)。reference
参数:参考位置,默认为0
(文件开头)。0
:从文件开头计算偏移量。offset
必须是非负整数。1
:从文件对象的当前位置计算偏移量。offset
可以是正数或负数。2
:从文件末尾计算偏移量。offset
通常是负数。
注意:
- 在文本文件(模式字符串中没有
b
的文件)中,只允许相对于文件开头 (reference = 0
) 的seek
操作,除非offset
是 0,或者offset
是之前tell()
返回的值。 reference = 1
或2
仅在以二进制模式打开文件时有效。
示例:
使用与前面相同的 info.txt
文件,并以二进制模式操作。
# 从文件开头偏移 6 个字节
with open('info.txt', 'rb') as f:
print(f.seek(6))
# 文件指针位置: 你好 |世界\n谢谢 ('|' 表示指针)
print(f.read().decode('utf-8')) # 读取剩余内容并解码
print(f.tell()) # 文件总字节数 (假设 14)
# 从文件末尾向前偏移 6 个字节
with open('info.txt', 'rb') as f:
print(f.seek(-6, 2))
# 文件指针位置: 你好 世界\n|谢谢 ('|' 表示指针)
print(f.read().decode('utf-8'))
输出结果:
6
世界
谢谢
14
10
谢谢
本教程详细介绍了 Python 中文件读取的各种方法,包括顺序读取(read()
,readline()
,readlines()
)和随机读取(tell()
,seek()
)。