我有一个中等大小的文件(25MB,1000000 行),我想读取除每隔三行之外的每一行。
第一个问题:将整个文件加载到内存中然后读取行(方法 .read()
)或加载并读取一行是否更快?时间(方法.readline()
)?
由于我不是经验丰富的编码员,因此我尝试了使用 itertools
模块中的 islice
方法的第二个选项。
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 部分可能会采取相同的方式,但您可能会从快速列表切片而不是计数行中受益一点(在总处理时间中),如果您有足够的工作内存来保存文件内容,并且如果可以接受预先加载整个文件而不是流。
关于python - 如何循环访问同一打开文件的两个生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52438356/