【问题标题】:Why the second time I run "readlines" on the same file nothing is returned?为什么我第二次在同一个文件上运行“readlines”没有返回?
【发布时间】:2010-08-19 17:35:23
【问题描述】:
>>> f = open('/tmp/version.txt', 'r')
>>> f
<open file '/tmp/version.txt', mode 'r' at 0xb788e2e0>
>>> f.readlines()
['2.3.4\n']
>>> f.readlines()
[]
>>>

我已经在 Python 的解释器中尝试过这个。为什么会这样?

【问题讨论】:

    标签: python


    【解决方案1】:

    您需要寻找到文件的开头。使用f.seek(0)回到开头:

    >>> f = open('/tmp/version.txt', 'r')
    >>> f
    <open file '/tmp/version.txt', mode 'r' at 0xb788e2e0>
    >>> f.readlines()
    ['2.3.4\n']
    >>> f.seek(0)
    >>> f.readlines()
    ['2.3.4\n']
    >>>
    

    【讨论】:

    • 是的,这就是你所要做的。请参阅我添加的示例。
    【解决方案2】:

    Python 会跟踪您在文件中的位置。当您结束时,它不会自动回滚。试试f.seek(0)

    【讨论】:

      【解决方案3】:

      了解其他一些海报未明确说明的重要部分是使用标记文件中当前位置的光标读取文件。因此,在第一次 readlines() 调用中,光标位于文件的开头,并且由于返回了所有文件数据,因此一直前进到文件的末尾。在第二个 readlines 调用中,光标位于文件末尾,因此当它读取到文件末尾时,它根本不移动,也不返回任何数据。出于教育目的,您可以快速编写一些代码来打开文件,读取几个字节或行,然后调用 readlines(),您将看到 readlines() 调用的输出从您离开的地方开始与您之前的读取,并继续到文件末尾。

      other 提到的 seek(0) 调用将允许您重置文件开头的光标以重新开始读取。

      【讨论】:

        【解决方案4】:

        除了寻找文件的开头之外,您还可以将值存储为以后可以在内存中需要它们时重复使用的东西。像这样的:

        with open('tmp/version.txt', 'r') as f:
          lines = f.readlines()
        

        我相信 with 语句是 2.6 中的新语句,在以前的版本中,您需要从 future 导入它。

        【讨论】:

        • 这是个好主意,假设发布者不希望从频繁更改的文件中获取新数据。
        猜你喜欢
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 2017-04-10
        • 2020-07-31
        • 1970-01-01
        • 2021-11-17
        • 2013-12-10
        • 2021-10-16
        相关资源
        最近更新 更多