Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取文件的第一行两次?_Python_File_Iterator - Fatal编程技术网

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这就是堆栈溢出的目的,在我看来:让其他人看到我们的盲点。至于
的用法:我只是假设您问题中的用法是第一次分配给
文件
,在这种情况下,将
一起使用是很好的做法。如果
文件
也在其他地方使用,您将需要更深入地了解要使用的确切解决方案。