【问题标题】:f.readlines() Won't Return Any Values?f.readlines() 不会返回任何值?
【发布时间】:2014-12-14 17:30:39
【问题描述】:

所以我正在阅读 Python 文档/教程,特别是我正在查看带有文件的输入/输出。这就是教程所说的将返回文件中的任何内容:

>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''

我在我的 .py 中放了同样的东西,它没有返回任何异常或问题,但它也没有返回任何值。这是我的代码:

f = open('test.txt')

f.readlines()

除非我使用变量和print,否则程序不会返回文件中的任何内容。这是我的文件内容:

Hello This Is Test
For Loops In Files
Flying Away
A Bird also Flies
Wow

关于为什么这不起作用的任何想法?我认为它是我的解释器,因为我使用的是 SublimeREPL,但在那之前它没有做任何奇怪的事情,所以我不太确定。此外,当我尝试在我的 Python 控制台中运行它时,它给了我一个错误,然后只是关闭了控制台,所以我什至看不到错误。相当适得其反。

编辑:澄清一下,我的问题不是for 循环,for 循环从以前开始就可以正常工作了。问题是 f.readlines() 不返回任何行,即使文档说它应该返回下一行。我将从我的代码中取出for 循环来澄清。另外,很抱歉,如果我混淆了f.readline()f.readlines(),但无论如何它们都不起作用。谢谢,

  • 赛义德

回答:对于遇到此问题或只是好奇的任何人,问题是在编写脚本时我必须使用print,但在命令提示符下,我可以使用f.readlines(),它会读取线。感谢@wwii。

【问题讨论】:

  • for items in readLine: readLine = f.readline() 没有意义。您正在为第一行中的每个字符读取文件的一行。
  • @Rawing 是的,我明白这一点,但即使我删除了除f=... 部分之外的所有代码,并且只输入f.readlines(),它仍然不会返回任何内容。
  • 您确定打开的是正确的文件吗?试试import os; print os.path.realpath(f.name),是你要打开的文件吗?
  • 我不确定这是否是一个错字,但readlines() 会读取文件的所有行。你已经混合readlinereadlines 有一段时间了。
  • file.readline() 返回一行。如果语句在 Python shell 提示符下执行(如教程示例中所示),则将显示返回值。如果语句在脚本中运行,那么您必须 print 返回的值才能显示在(发送到)stdout

标签: python file text return return-value


【解决方案1】:

如果有人来这里寻找,我已经找到了一个非常相似的问题的答案。因此,在 Python 中,如果您在 readlines() 之前运行了 readline() 的代码,那么它已经遍历了这些行。

尝试退出并只为文件输入readlines(),它会为您生成完整列表。

【讨论】:

    【解决方案2】:

    如果您想逐行读取文件,这将是一个更好的选择。 'for line in f:' 将文件作为列表进行迭代。 'line' 变量包括尾随的 '\n' 或 '\r\n',因此您需要去掉它们。

    'with' 语句确保文件被关闭,即使你的程序在读取文件时抛出异常。

    with open('test.txt','r') as f:
        for line in f:
            print(line.rstrip('\n'))
    

    输出:

    $ python test.py
    Hello This Is Test
    For Loops In Files
    Flying Away
    A Bird also Flies
    Wow
    

    使用 readlines:

    open('test.txt','r') as f:
        lines = f.readlines()
    
    for line in lines:
        print(line.rstrip('\n'))
    

    readlines 将文件转换为内存中的列表。如果您必须读取大文件,则效率不高。

    同时使用:

    with open('test.txt','r') as f:
        line = f.readline()
        print(line.rstrip('\n'))
        print
        lines = f.readlines()
    
    for line in lines:
        print(line.rstrip('\n'))
    

    输出:

    $ python test.py
    Hello This Is Test
    
    For Loops In Files
    Flying Away
    A Bird also Flies
    Wow
    

    从 python 控制台:

    $ python
    Python 2.7.8 (default, Jul 28 2014, 01:34:03)
    [GCC 4.8.3] on cygwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> f = open('test.txt')
    >>> f.readlines()
    ['Hello This Is Test\n', 'For Loops In Files\n', 'Flying Away\n', 'A Bird also Flies\n', 'Wow\n', '\n']
    >>> f.close()
    

    【讨论】:

    • 感谢您的意见。我在帖子中澄清了我的问题。问题是文档说f.readlines() 应该在文件中返回一行,但是当我输入f.readlines 时,什么都没有返回,只是一个空控制台。
    • f.readlines() 将返回文件中的每一行。但是,它确实从文件位置开始。所以,如果你先做五个 readline(),readlines() 将从最后一个 readline() 停止的地方开始。
    • 好的,但为什么它根本不返回任何东西?我确保我打开了我想要的文件,我确保文件中有文本,我确保我的代码没有任何错误,但是当我运行它时,SublimeREPL 只返回一个空控制台。
    • 文件小于1KB。
    • 它一定是你的环境中的东西。也许 Sublime 运行 shell 的路径不是正确的目录。尝试从命令行运行程序,看看它是否可以工作。
    【解决方案3】:

    f.readlines() 一次返回列表中的所有行,例如:

    f=open('test.txt')
    f.readlines()
    ['Hello This Is Test\n', 'For Loops In Files\n', 'Flying Away\n', 'A Bird also Flies\n', 'Wow']  
    

    至于 f.readline() 将从光标所在位置开始逐行返回,直到文件末尾,您的示例输出将是:

    f=open('test.txt')
    f.readline()
    'Hello This Is Test\n'
    f.readline()
    'For Loops In Files\n'
    f.readline()
    'Flying Away\n'
    f.readline()
    'A Bird also Flies\n'
    f.readline()
    'Wow'
    f.readline()
    ''#empty string
    

    将光标设置到文件的开头使用 seek(0)

    【讨论】:

      【解决方案4】:

      如果你要使用 readline ,你必须移动你的光标。就像每次 seek[0] 一样,将光标移动到起点。

      您可以使用 readlines() 方法。

      readlines=f.readlines()
      for i in readlines:
          print (i)
      

      【讨论】:

      • 所以我只需将f.seek[0] 放在for 循环的外部,它应该可以工作吗?还是我必须手动进入文件并将光标放在顶部? f.readlines() 没有区别。
      • 感谢for 循环,但我真正的问题是,即使没有for 循环,放置f.readlines() 也无济于事,即使文档说它应该返回第一行。
      • readline() 不会每次都 seek(0)。请参阅我的评论中的上述代码。
      【解决方案5】:

      回答:对于遇到此问题或只是好奇的任何人,问题是在编写脚本时我必须使用 print,但在命令提示符下,我可以只使用 f.readlines(),它会读取线。感谢@wwii。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-20
        • 2016-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        相关资源
        最近更新 更多