【问题标题】:How does readline() function really work in Python?readline() 函数在 Python 中是如何工作的?
【发布时间】:2022-02-03 06:13:54
【问题描述】:

这是我的例子:

我的文件:

abefgh
2345
6^7&8*
31
1
1

我的代码:

handle = open('TestFile','r')
for line in handle:
    print(handle.readline())
    

输出:

2345
31
1

为什么它只打印交替行?

谢谢大家。现在我明白了,每次我运行 readline() 命令。光标移动到行尾。所以下次它会从下一行开始读取。 请投票,以便我可以再次发布问题。我不能再发问题了。提前谢谢!

【问题讨论】:

  • 您要打印的行是linehandle.readline() 读取 另一个 行。
  • 等等,我以为 readline() 函数会从行/文件的开头读取,对吧?所以如果第一行是“abefgh”(在这种情况下这也被认为是一个文件),我认为它会从头开始读取?
  • readline() 从文件句柄中读取,从当前位置开始(即在一行之后,即在下一行的开头)直到并包括下一行结尾(或文件的结尾)。

标签: python file readline


【解决方案1】:

在您的代码中:

handle = open('TestFile','r')
for line in handle:
    print(handle.readline())

循环for line in handle 已经从handle 一次读取一行。然后使用handle.readline() 阅读next 行并打印出来。每次迭代都会发生这种情况,因此您只能每隔一行获得一次。

这里要意识到的重要一点是.readline() 不记得它在哪里,handle 记得。因此,当您打开 handle 时,它位于文件的开头。然后,当for 得到下一行时,它在第二行的开头。然后readline() 读取到并包括下一行的结尾,所以它在第三行的开头,依此类推。

你想要:

handle = open('TestFile','r')
for line in handle:
    print(line)

此外,您希望关闭文​​件,理想情况下您希望确保它们关闭而不必担心自己关闭它们,这就是上下文管理器的用途。听起来很复杂,其实很简单:

with open('TestFile', 'r') as handle:
    for line in handle:
        print(line)

这是有效的,因为像handle 这样的文件句柄也是一个迭代器,并提供了一个__next__ 方法。这意味着您可以使用for 循环它,它会一次生成一个元素的内容。对于文本文件,这意味着每次调用 __next__ 方法时,无论是作为 next(handle) 还是在使用 for 循环时,它都会读取一行并生成它。

with 块确保 handle 在退出 with 块后立即关闭。

最后,您可能会想知道为什么您的行打印时在它们之间有一个空行。这是因为您的文件是一个文本文件,其中的行由某种行尾字符(或 Windows 上的字符)分隔。

摆脱这些的一种方法是从行尾去除空格:

with open('TestFile', 'r') as handle:
    for line in handle:
        print(line.rstrip())

另一种方法是读取整个文件,分割行尾,结果行将不再有行尾:

with open('TestFile', 'r') as handle:
    for line in handle.read().splitlines():
        print(line)

【讨论】:

  • 好的,谢谢。我想我慢慢明白了。关于此代码:handle = open('TestFile','r') for line in handle: print(line).大声笑我如何在评论中删除线
  • 没有办法在评论中很好地呈现多于一行的代码,但只要问你的后续问题,我会尽力理解它:) - 如果你需要要使用一些代码进行解释,请随时编辑您的问题并将后续问题添加到其文本中。
  • 好的,谢谢。我想我慢慢明白了。关于此代码:handle = open('TestFile','r') -- for line in handle: -- print(line) -- 如果我在最后添加一行“handle.readline()”,它是如何实现的只是破坏了 for 循环并仅打印交替行(而不是打印所有行)。这怎么可能?我认为 for 循环无论如何都会跑遍全线?
  • 我已经在 cmets 中或多或少地回答了您的问题。 for 循环的一个步骤会导致读取一行,因此文件句柄现在指向下一行的开头。 readline() 然后读取下一行。然后下一个for 步骤导致下一个被读取,等等。
  • 我还为答案添加了一些额外的解释-您应该可以从中弄清楚,如果您遇到困难,请重新阅读并尝试逐步进行。
猜你喜欢
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2017-04-18
  • 2016-02-16
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多