在Python中遍历文件中的每一行

30

我见过两种处理文件的方法:

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

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

我知道在第一种情况下,文件会像列表一样操作,所以for循环会像遍历列表一样遍历文件。那么在第二种情况下,我们读取文件然后遍历contents发生了什么?采用每种方法的后果是什么,我应该如何选择?


第一个示例中,更准确地说文件将充当懒惰的生成器。第二个示例将读取并存储文件内容以进行读取。 - Anzel
据我所知,两者是相同的。找出最好的方法是,__print type(content)s__和__print type(file)__然后我们可以确定类型,其中列表或字符串。 - Nabin
2个回答

35

第一个示例是逐行迭代文件。在这种情况下,整个文件数据不会一次性全部读入内存,而是只有当前行被读入内存。如果要处理非常大的文件并且不知道文件大小,这非常有用并且对于健壮性也很好。

第二个示例中,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

3
第二种方法会将整个文件读入内存,而第一种方法是每次迭代读取一行。因此,第一种方法在处理大文件时更加内存高效。请注意,这并不改变原文的意思。 - geompalik
@geompalik 谢谢,我也把那个加到了我的答案里。 - Anand S Kumar

15

第二种情况将文件内容读入一个大字符串中。如果您迭代一个字符串,您将依次获得每个字符。如果您想逐行获取每一行,您可以这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接