Python 中如何把文件的每一行读入一个列表?
Python 把文件读成行列表:f.readlines() 一次性读入(含换行符),或列表推导式 [line.rstrip() for line in f]。大文件建议迭代处理。本文对比各方法。
常用写法:f.readlines() 直接得到行列表(通常保留行尾,最后一行可能没有换行);想去掉换行符:[line.rstrip('\n') for line in f]。大文件注意内存,可改用迭代逐行处理。
readlines() 一次读入
with open('file.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(lines) # ['第一行\n', '第二行\n', ...]
顺便去掉换行符
with open('file.txt', 'r', encoding='utf-8') as f:
lines = [line.rstrip('\n') for line in f]
过滤空行/注释
with open('file.txt') as f:
lines = [line.strip() for line in f if line.strip() and not line.lstrip().startswith('#')]
大文件的内存考量
readlines() 把整个文件加载进内存。GB 级文件建议不建列表,直接迭代处理:
with open('huge.log') as f:
for line in f: # 避免累计全部行,但内存仍受缓冲与最长单行影响
process(line)
常见问题(FAQ)
Q:readlines() 和 read().splitlines() 有区别吗?
A:结果接近。read().splitlines() 默认去掉行分隔符,识别的Unicode行边界比文本文件通用换行更多,故结果不总与readlines相同;readlines() 保留行尾。两者都是全量加载。
Q:只要前 N 行?
A:itertools.islice(f, N) 惰性取前 N 行,不会读完整个文件。
Q:编码错误中断读取?
A:open(..., errors='replace') 或 errors='ignore' 容错会替换或丢弃字节,不能视为无损;应优先确认来源编码,chardet 仅作启发式判断。