【问题标题】:Iterating over lines in a file python遍历文件python中的行
【发布时间】:2021-09-12 06:37:30
【问题描述】:

我正在学习 python。如果有人可以解释以下处理文件的区别,是否有可能:

file = open("file.txt")
for line in file:
    #do something

file = open("file.txt")
contents = file.read()
for line in contents:
    # do something

我知道在第一种情况下,文件将充当列表,因此我们在迭代列表的元素时迭代文件,但在第二种情况下,我不确定如何解释如果我先读取文件,然后遍历它?

【问题讨论】:

  • 更准确地说,file 将在第一个示例中充当懒惰的generator。第二个将读取存储在内存中的文件内容以供读取。
  • 据我所知,两者都是一样的。最好的找出方法是,print type(content)s__and __print type(file)然后我们就可以确定类型,list还是string

标签: python


【解决方案1】:

在第一个中,您逐行遍历文件。在这种场景下,整个文件数据不是一次性读入内存的;相反,只有当前行被读入内存。这对于处理非常大的文件很有用,如果您不知道文件是否会很大,这对于稳健性很有用。

在第二个中,file.read() 将完整的文件数据作为字符串返回。当您对其进行迭代时,您实际上是在逐个字符地迭代文件的数据。这会将完整的文件数据读入内存。

这是一个展示这种行为的例子。

a.txt 文件包含

Hello
Bye

代码:

>>> f = open('a.txt','r')
>>> for l in f:
...     print(l)
...
Hello

Bye


>>> f = open('a.txt','r')
>>> r = f.read()
>>> print(repr(r))
'Hello\nBye'
>>> for c in r:
...     print(c)
...
H
e
l
l
o


B
y
e

【讨论】:

  • 另外,第二个读取内存中的整个文件,而第一个,每次迭代一行。也就是说,第一个是内存效率,特别是对于大文件。
  • @geompalik 谢谢,我也将其添加到我的答案中。
【解决方案2】:

第二种情况将文件的内容读入一个大字符串。如果你遍历一个字符串,你会依次得到每个字符。如果你想依次获取每一行,你可以这样做:

for line in contents.split('\n'):
     # do something

或者您可以使用readlines() 而不是read() 将内容作为行列表读取。

with open('file.txt','r') as fin:
    lines = fin.readlines()
for line in lines:
    # do something

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多