The Hitchhiker’s Guide to Python建议您使用它更好:
for line in f:
print line
比:
a = f.read()
print a
其中f
是文件对象。
虽然我可以看到这不是文章中的比较试图证明的主要观点(它是关于上下文管理者的),但我想知道这两种方法之间有什么区别。
使用前一种方法是否更好,即使我只需要整个文件内容,而不是在每一行上进行任何种类或处理?
答案 0 :(得分:4)
这与内存管理有关。
如果您使用的文件很大(MB' s甚至GB' s),那么使用read
方法效率很低,因为它读入 all < / em>文件的内容,并将它们存储为字符串对象。来自docs:
file.read([size])
从文件中读取最多
size
个字节(如果读取在获得size
个字节之前读取EOF,则更少)。如果size
参数为负数或省略,则读取所有数据,直到达到EOF 。
强调我的。你可以猜到,这不是一件好事。即使您设法避免使用MemoryError
,您仍然会占用大部分可用内存,从而极大地影响程序的性能。
然而,for循环方法通过一次只处理一行来消除此问题。迭代文件对象会像迭代器一样逐个生成它的行。来自docs:
文件对象是它自己的迭代器,例如
iter(f)
返回f
(除非f
已关闭)。当文件用作迭代器时,通常在 一个for循环(例如,for line in f: print line.strip()
),. 重复调用next()
方法。此方法返回下一个输入 线,或在点击EOF时加注StopIteration
因此,您不必担心过多的内存消耗,因为在任何给定时间内只会有一行内存。
然而,如果你的文件很小,那么使用read
方法是完全正常的,因为内存影响可以忽略不计。事实上,对于小文件,可以方便地同时拥有所有数据,以便您可以将其作为一个整体使用(在其上调用字符串方法,如str.count
或str.find
,将其切片)分成几部分等。)。
答案 1 :(得分:1)
read()
会将文件加载到内存中,如果它不是一个不大问题的大文件
如果适合大文件(例如GB),加载时可能会耗尽内存。所以对于使用文件对象的大文件循环更好。它不会让你的内存耗尽并使你的电脑变慢