Python 如何读取文件的第一行两次?
我有一个包含很多行的大文件,我想先读第一行,然后再从第一行开始遍历所有行 我首先想到的是这样的事情:Python 如何读取文件的第一行两次?,python,file,iterator,Python,File,Iterator,我有一个包含很多行的大文件,我想先读第一行,然后再从第一行开始遍历所有行 我首先想到的是这样的事情: file = open("fileName", 'r') first_line = file.readline() DoStuff_1(first_line) for line in file: DoStuff_2(line) file.close() 但是这个脚本的问题是传递给DoStuff_2的第一行是第二行,而不是第一行。我对文件是什么类型的对象没有很好的直觉。我认为它是一个迭
file = open("fileName", 'r')
first_line = file.readline()
DoStuff_1(first_line)
for line in file:
DoStuff_2(line)
file.close()
但是这个脚本的问题是传递给DoStuff_2
的第一行是第二行,而不是第一行。我对文件是什么类型的对象没有很好的直觉。我认为它是一个迭代器,不知道如何处理它。我找到的坏办法是
file = open("fileName", 'r')
first_line = file.readline()
count = 0
for line in file:
if count == 0:
count = 1
DoStuff_1(first_line)
DoStuff_2(line)
file.close()
但它非常愚蠢,而且计算成本有点高,因为它在每次迭代中都运行if语句 您可以这样做:
with open('fileName', 'r') as file:
first_line = file.readline()
DoStuff_1(first_line)
DoStuff_2(first_line)
# remaining lines
for line in file:
DoStuff_2(line)
请注意,我已将您的代码更改为与一起使用,因此文件
将自动关闭。我希望使用生成器来抽象您的常规控制流。比如:
def first_and_file(file_obj):
"""
:type file_obj: file
:rtype: (str, __generator[str])
"""
first_line = next(file_obj)
def gen_rest():
yield first_line
yield from file_obj
return first_line, gen_rest()
在Python 2.7中,将
的收益率替换为:
for line in file_obj:
yield line
另一个答案是只打开文件两次
with open("file.txt", "r") as r:
Do_Stuff1(r.readline())
with open("file.txt", "r") as r:
for line in r:
Do_Stuff2(line)
对于此问题的一般情况,解决方案之一是保存您所在的行号。在完成一个需要相对于当前行转到上一行的操作后,通过执行file.seek(0),然后在file.readline()上循环所需的次数,使用行号变量 open
返回python中的生成器:哈哈,这太明显了!我猜想,当你处于更复杂的代码中时,你会忽略明显的问题,但是一旦问题被简化为一个问题的基本元素,答案就很明显了。非常感谢。我没有使用with
,因为我不知道对象文件
是否会存在于with
函数中调用的每个函数的环境中。它是?我目前刚刚将file
定义为global.@Remi.b这就是堆栈溢出的目的,在我看来:让其他人看到我们的盲点。至于与
的用法:我只是假设您问题中的用法是第一次分配给文件
,在这种情况下,将与
一起使用是很好的做法。如果文件
也在其他地方使用,您将需要更深入地了解要使用的确切解决方案。