连续读取多个文件



我试图连续读取多个文件前的一行,即在读取完第一个文件后转到下一个文件。例如,我有file1和file2,内容分别为1 2 3和3 4 5
我尝试了以下操作;但是,它只读取文件的前两行,当它完成对第一个文件内容的迭代时,不会转到下一个文件。

for files in file_list:
with open(files, 'r') as f:
line = f.readline()
next_line = f.readline()

我需要提前读取一行,并将linenext_line传递给我的其他函数,所以当我打印我的行和下一行时,我希望它们分别为1,3,3,5和2,4。

对于第一个文件,第1行,第2行,第3行,在遍历第一个文件后,它转到下一个文件,其中第3行、第4行、第5行…等等

您可以定义一个函数,该函数将遍历所有文件并从这些文件中产生。然后,您可以像使用open:返回的文件句柄一样使用它

def open_multiple_files(*files):
for file in files:
with open(file) as f:
yield from f
# Usage:
for line in open_multiple_files("file1.txt", "file2.txt"):
print(line.strip())

将打印

1
2
3
3
4
5

您不能访问迭代中的下一行,但可以跟踪上一行和当前行。然后,您可以简单地将当前行命名为next_line,将上一行命名为this_line

file_handle = open_multiple_files("file1.txt", "file2.txt")
this_line = next(file_handle).strip()
for next_line in file_handle:
next_line = next_line.strip()
print("This line: ", this_line, "| Next line: ", next_line)
this_line = next_line

哪个给出:

This line:  1 | Next line:  2
This line:  2 | Next line:  3
This line:  3 | Next line:  3
This line:  3 | Next line:  4
This line:  4 | Next line:  5

如果你想简单地以两行一组的方式读取所有这些文件,其中组块中的第一行是this_line,第二行是next_line,你可以在循环中使用next,如下所示:

for this_line in file_handle:
this_line = this_line.strip()
next_line = next(file_handle).strip()
print("This line: ", this_line, "| Next line: ", next_line)

由于文件句柄会跟踪它们读取的距离,因此第一次迭代中的next调用将消耗一行,第一次迭代后,this_line将是file_handle中的第三行,这将输出:

This line:  1 | Next line:  2
This line:  3 | Next line:  3
This line:  4 | Next line:  5

如果您不希望一个文件的内容与另一个文件合并,您可以跳过打开多个文件的步骤,将该循环移到上面的循环之外。当然,在这种情况下,当没有next_line时,您的文件句柄将抛出一个StopIteration错误,但您可以捕获该错误并将next_line设置为空字符串(或根据您的意愿进行处理(:

for file in ["file1.txt", "file2.txt"]:
with open(file) as f:
for this_line in f:
this_line = this_line.strip()
try:
next_line = next(f).strip()
except StopIteration:
next_line = "<END OF FILE>"
print("This line: ", this_line, "| Next line: ", next_line)

这将输出:

This line:  1 | Next line:  2
This line:  3 | Next line:  <END OF FILE>
This line:  3 | Next line:  4
This line:  5 | Next line:  <END OF FILE>

最新更新