Skip to content

Python3 文件读取详解

在 Python 中,文件操作是至关重要的技能。open() 函数是打开文件的关键,它会创建并返回一个文件对象。通过这个对象,我们可以对文件进行各种操作,例如读取内容。本教程将详细介绍如何使用文件对象进行顺序读取和随机读取,并提供清晰的代码示例,帮助你快速上手。

顺序读取:逐行逐字,步步为营

顺序读取是指按照文件中内容的先后顺序进行读取。Python 提供了三种主要方法来实现顺序读取:read()readline()readlines()

1. read():一口吞,全盘读取

read(size=-1) 方法用于从文件中读取数据。

  • size 参数:指定要读取的字节数(二进制模式)或字符数(文本模式)。
  • 默认情况:如果 size 未指定或为负数,read() 会读取并返回文件的全部内容。

示例:

假设我们有一个名为 info.txt 的文件,内容如下(采用 UTF-8 编码):

你好 世界
谢谢

代码示例:

python
# 读取 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 文件。

代码示例:

python
# 读取最多 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 循环来逐行迭代文件内容。

python
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 中遍历文件的首选方式。

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 文件。

代码示例:

python
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 个字节)。需要以二进制模式打开文件

python
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 = 12 仅在以二进制模式打开文件时有效。

示例:

使用与前面相同的 info.txt 文件,并以二进制模式操作。

python
# 从文件开头偏移 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())。