我试图连续读取多个文件前的一行,即在读取完第一个文件后转到下一个文件。例如,我有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()
我需要提前读取一行,并将line
和next_line
传递给我的其他函数,所以当我打印我的行和下一行时,我希望它们分别为1,3,3,5和2,4。
您可以定义一个函数,该函数将遍历所有文件并从这些文件中产生。然后,您可以像使用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>