迭代文件内容¶
一种常见的文件操作是迭代其内容, 并在迭代过程中反复采取某种措施.
每次一个字符(或字节)¶
一种最简单(也可能是最不常见)的文件内容迭代方式是: 在while循环中使用方法read().
Example:
with open(filename) as f:
char = f.read(1)
while char:
process(char)
char = f.read(1)
上面的代码之所以可行, 是因为到达文件结尾时, 方法read()将返回一个空字符串.
但在此之前, 返回的字符串都只包含一个字符(对应于布尔值True).
但是上面的代码中char = f.read(1)语句出现了两次, 代码重复不是一件好事情.
可以改进为使用while True/break技巧:
with open(filename) as f:
while True:
char = f.read(1)
if not char:
break
process(char)
每次一行¶
处理文本文件时, 通常想做的是迭代其中的行, 而不是每个字符, 可以在while循环中使用readline()方法:
with open(filename) as f:
while True:
line = f.readline()
if not line:
break
process(line)
读取所有文件内容¶
如果文件不太大, 可一次读取整个文件.
为此, 可使用方法read()并不提供任何参数(将整个文件读取到一个字符串中), 也可使用方法readlines()(将文件读取到一个字符串列表中, 其中每个元素都是一行).
通过这样的方式读取文件, 可轻松地迭代字符和行.
Example:
# 使用read迭代字符
with open(filename) as f:
for char in f.read():
process(char)
# 使用readlines迭代行
with open(filename) as f:
for line in f.readlines():
process(line)
使用fileinput实现延迟行迭代¶
有时候需要迭代大型文件中的行, 此时使用readlines()将占用太多内存.
当然, 可以转而结合使用while循环和readline().
但在Python中, 在可能的情况下, 应首选for循环.
可以使用一种称为延迟行迭代的方法, 说它延迟是因为它只读取实际需要的文本部分.
Example:
import fileinput
# 使用fileinput实现延迟行迭代
for line in fileinput.input(filename):
process(line)
文件迭代器¶
文件实际上也是可迭代的, 这意味着可在for循环中直接使用它们来迭代行, 这也是最常用的方法.
Example:
with open(filename) as f:
for line in f:
process(line)
- 与其它文件一样,
sys.stdin也是可迭代的, 因此要迭代标准输入中的所有行, 可像下面这么做:
import sys
for line in sys.stdin:
process(line)
- 因为文件对象也是可迭代的, 可对迭代器做的事情基本上都可以对文件做, 如(使用
list(open(filename)))将其转换为字符串列表, 其效果与使用readlines()相同.