【问题标题】:Reading files in Python with for loop在 Python 中使用 for 循环读取文件
【发布时间】:2017-05-24 20:54:47
【问题描述】:

要在 Python 中读取文件,必须先打开文件,然后需要 read() 函数。为什么当我们使用for循环读取文件的行时,不需要read()函数?

filename = 'pi_digits.txt'
with open(filename,) as file_object:
    for line in file_object:
        print(line)

我习惯了下面的代码,显示read 要求。

for line in file_object.read():

【问题讨论】:

标签: python


【解决方案1】:

这是因为 file_object 类具有内置的“iter”方法,该方法说明文件将如何与迭代语句交互,例如 for 循环。

换句话说,当您说for line in file_object 时,文件对象正在引用其__iter__ 方法,并返回一个列表,其中每个索引都包含文件的一行。

【讨论】:

    【解决方案2】:

    Python 文件对象在您对其进行迭代时定义特殊行为,在本例中使用 for 循环。每次到达循环顶部时,它都会隐式调用readline()。仅此而已。

    请注意,您“习惯”的代码实际上会逐个字符地迭代,而不是逐行!那是因为您将遍历一个字符串(read() 的结果),而当 Python 遍历字符串时,它会逐个字符地进行。

    【讨论】:

      【解决方案3】:

      with 语句中的open 命令隐式处理读取。它创建了一个生成器,该生成器一次生成一条记录(read 隐藏在生成器中)。对于文本文件,每一行是一条记录。

      请注意,第二个示例中的read 命令将整个 文件读入字符串;这比一次一行的例子消耗更多的内存。

      【讨论】:

      • 另外,file_object.read() 返回单个字符串,其迭代器一次返回单个字符,而 file 迭代器实际上一次返回一行。
      • 这个答案不正确,with 与此无关。以任何其他方式打开文件,循环将表现相同。
      • 我认为没有错,只是措辞不清楚。 with open ... as 肯定会打开文件(特别是对 open 的调用;with 语句仅确保它也将被关闭),尽管它是生成的 file 对象(或任何 open 结束在 Python 3 中返回),它会生成 for 循环使用的迭代器,以实际从文件中读取。
      • 我会说它至少具有误导性。很难将其理解为 不是 错误地说 with 起作用。
      • 我的解释是非常介绍性的,但你们是对的:它在技术上具有误导性,我需要对其进行编辑。
      猜你喜欢
      • 2022-11-18
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2020-07-19
      • 2018-07-16
      相关资源
      最近更新 更多