python - 如何遍历同一个打开文件的两个生成器
问题描述
我有一个中等大小的文件(25MB,1000000 行),我想读取除每三行之外的每一行。
第一个问题:将整个文件加载到内存中然后读取行(方法.read()
)或一次加载并读取一行(方法)是否更快.readline()
?
由于我不是经验丰富的编码员,因此我尝试了使用模块中的islice
方法的第二个选项。itertools
import intertools
with open(input_file) as inp:
inp_atomtype = itertools.islice(inp, 0, 40, 3)
inp_atomdata = itertools.islice(inp, 1, 40, 3)
for atomtype, atomdata in itertools.zip_longest(inp_atomtype, inp_atomdata):
print(atomtype + atomdata)
虽然循环通过单个生成器(inp_atomtype
或inp_atomdata
)打印正确的数据,但同时循环通过它们(如在此代码中)会打印错误的数据。
第二个问题:如何使用生成器达到所需的行?
解决方案
您不需要对迭代器进行切片,一个简单的行计数器就足够了:
with open(input_file) as f:
current_line = 0
for line in f:
current_line += 1
if current_line % 3: # ignore every third line
print(line) # NOTE: print() will add an additional new line by default
至于把它变成一个生成器,只是yield
行而不是打印。
在速度方面,考虑到您无论如何都会读取您的行,I/O 部分可能会花费相同的时间,但如果您有足够的数量,您可能会从快速列表切片而不是计数行中受益一点(总处理时间)工作内存来保存文件内容,如果预先加载整个文件而不是流式传输是可以接受的。
推荐阅读
- flutter - 如何制作一个 IconPicker,一个列出图标供用户选择的小部件
- aws-lambda - AWS Lambda 节流——为什么如此沮丧?
- django - 将许多上传的文件保存到 db save() 方法时,仅对查询中的最后一个文件有效
- r - 将多个列表转换为 r 中的一个数据帧
- javascript - 三个 JS - 使对象在悬停时远离鼠标倾斜?
- npm - 错误:EACCES:权限被拒绝,打开“/root/.config/truffle/config.json”
- ios - 获取孩子的参数与获取没有参数的孩子有何不同?
- assembly - 为什么push先减少堆栈指针?
- python - pytest 标记:标记整个目录/包
- openlayers - 是否有任何自动方法可以在 openlayers 中发现 epsg 代码和 proj4 到 geojson 文件?