核心概念
- 读取文件: 使用
open()函数打开文件,得到一个文件对象。 - : 使用文件对象的
.read()方法读取所有内容,或者.readlines()方法按行读取。 - 分割字符串: 使用字符串的
.split()方法,根据指定的分隔符(默认是空格)将一个字符串拆分成一个列表。
基础用法:按行读取并分割
这是最常见的情况:文件中的每一行代表一条记录,记录中的数据由空格、逗号等符号分隔。

假设我们有一个名为 data.txt 的文件,内容如下:
data.txt
apple 10 red
banana 20 yellow
orange 15 orange
grape 5 purple
示例代码
# 1. 打开文件
# 使用 'with' 语句可以确保文件在操作完成后自动关闭,是推荐的做法。
# 'r' 表示读取模式 (read)。
with open('data.txt', 'r', encoding='utf-8') as file:
# 2. 逐行读取
# file.readlines() 会返回一个列表,每个元素是文件中的一行(包括末尾的换行符 \n)
lines = file.readlines()
# 3. 遍历每一行并进行分割
for line in lines:
# line.strip() 可以移除字符串首尾的空白字符(包括 \n, \t, 空格等)
# 这一步很重要,可以避免分割结果中出现空字符串
parts = line.strip().split()
# parts 是一个列表,['apple', '10', 'red']
print(f"分割后的列表: {parts}")
# 你可以方便地访问每个部分
if len(parts) >= 3:
fruit = parts[0]
quantity = parts[1]
color = parts[2]
print(f"水果: {fruit}, 数量: {quantity}, 颜色: {color}")
print("-" * 20)
代码解释
-
with open('data.txt', 'r', encoding='utf-8') as file::open('data.txt', 'r'): 打开data.txt文件,准备进行读取 ('r')。encoding='utf-8': 指定文件编码,这对于处理包含非英文字符的文件至关重要,可以避免乱码。as file: 将打开的文件对象赋值给变量file。with ... as ...: 这是一个上下文管理器,它会自动处理文件的关闭,即使发生错误也能保证文件被正确关闭。
-
lines = file.readlines():
(图片来源网络,侵删)- 读取文件的所有行,并将它们作为一个列表返回,列表中的每个元素都包含行末的换行符
\n。
- 读取文件的所有行,并将它们作为一个列表返回,列表中的每个元素都包含行末的换行符
-
for line in lines::- 遍历
lines列表中的每一行。
- 遍历
-
line.strip():- 移除
line字符串开头和结尾的空白字符,主要是\n(换行符),如果不做这一步,split()的结果可能会包含空字符串,['apple', '10', 'red', '']。
- 移除
-
.split():- 这是核心的分割方法,当不提供任何参数时,它会根据任意空白字符(空格、制表符
\t、换行符等)进行分割,并自动忽略连续的空白符。 - 它返回一个列表,
'apple 10 red'.split()会得到['apple', '10', 'red']。
- 这是核心的分割方法,当不提供任何参数时,它会根据任意空白字符(空格、制表符
进阶用法:指定分隔符
很多时候,数据是用逗号、分号或其他特定符号分隔的,这时,你需要向 split() 方法传入分隔符作为参数。

假设我们有一个名为 csv_data.txt 的文件,内容如下:
csv_data.txt
ID,Name,Score
1,Alice,95
2,Bob,88
3,Charlie,76
示例代码
with open('csv_data.txt', 'r', encoding='utf-8') as file:
# 跳过表头
header = file.readline()
print(f"表头: {header.strip()}")
for line in file:
# 使用逗号作为分隔符
parts = line.strip().split(',')
# parts 现在是 ['1', 'Alice', '95'] 这样的列表
student_id = parts[0]
name = parts[1]
score = parts[2]
print(f"学号: {student_id}, 姓名: {name}, 分数: {score}")
代码解释
line.strip().split(','):- 这次我们传入了 作为参数,告诉
split()方法请用逗号来分割字符串。 - 这对于处理 CSV 格式的文件非常有用。
- 这次我们传入了 作为参数,告诉
更高效的方法:直接迭代文件对象
对于非常大的文件,使用 file.readlines() 会一次性将所有内容读入内存,可能导致内存不足,更高效的方法是直接迭代文件对象,Python 会自动逐行读取。
print("\n--- 使用更高效的方法 ---")
with open('data.txt', 'r', encoding='utf-8') as file:
# 直接 for 循环 file 对象,它会自动逐行迭代
for line in file:
parts = line.strip().split()
if parts:
fruit = parts[0]
quantity = parts[1]
color = parts[2]
print(f"高效处理 - 水果: {fruit}, 数量: {quantity}, 颜色: {color}")
这种方法在内存使用上更优,是处理大文件的推荐方式。
总结与最佳实践
| 场景 | 推荐方法 | 说明 |
|---|---|---|
| 按行处理 | with open(...) as file:for line in file: |
最佳实践,内存高效,代码简洁。 |
| 一次性读取所有行 | with open(...) as file:lines = file.readlines() |
适合小文件,方便随机访问某一行。 |
| 分割符是空白符 | line.strip().split() |
默认行为,用空格、Tab等分割。 |
| 分割符是特定字符 | line.strip().split(',') |
用逗号、分号等指定的单个字符分割。 |
| 分割符是多个字符 | line.strip().split('::') |
可以用多字符作为分隔符。 |
| 处理CSV文件 | import csvwith open(..., 'r') as f:reader = csv.reader(f)for row in reader: |
强烈推荐,Python 的 csv 模块能更好地处理CSV文件的各种边缘情况(如引号、转义等)。 |
核心要点回顾:
- 始终使用
with open(...)来管理文件。 - 始终指定
encoding,特别是utf-8。 - 使用
line.strip()来清理每行的首尾空白。 - 根据数据格式选择
split()的参数,无参用于空白符,有参用于特定分隔符。 - 处理大文件时,直接迭代文件对象,而不是使用
readlines()。
