我什么时候应该使用file.read()或file.readlines()?

时间:2016-06-29 16:39:43

标签: python io timeit

我注意到,如果我遍历一个我打开的文件,那么迭代它就会快得多,而没有"读取" -ing它。

即。

l = open('file','r')
for line in l:
    pass (or code)

快得多
l = open('file','r')
for line in l.read() / l.readlines():
    pass (or code)

第二个循环将花费大约1.5倍的时间(我在完全相同的文件上使用timeit,结果是0.442对0.660),并且会得到相同的结果。

那么 - 我什么时候应该使用.read()或.readlines()?

因为我总是需要遍历我正在阅读的文件,并且在经过艰苦的学习后,.read()对大数据的缓慢感觉 - 我似乎无法想象曾经使用过它再次。

5 个答案:

答案 0 :(得分:14)

对您的问题的简短回答是,这三种读取文件位的方法都有不同的用例。如上所述,f.read()将文件作为单独的字符串读取,因此允许相对容易的文件范围操作,例如文件范围的正则表达式搜索或替换。

f.readline()读取文件的一行,允许用户解析单行而不必读取整个文件。使用f.readline()还可以更容易地在读取文件时应用逻辑,而不是逐行完成迭代,例如文件在中途改变格式时。

使用语法for line in f:允许用户逐行迭代文件,如问题中所述。

(如另一个答案中所述,本文档阅读非常好):

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

编辑: 之前声称readline()可用于在for循环迭代期间跳过一行。但是,这在python 2.7中不起作用,也许是一个值得怀疑的做法,因此该声明已被删除。

编辑: 添加了f.readline()和f.read()

的用例示例

答案 1 :(得分:1)

希望这有帮助!

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

  

当省略大小或为负时,将读取并返回文件的全部内容;如果文件的大小是机器内存的两倍,那就是你的问题

抱歉所有的修改!

  

要从文件中读取行,可以循环遍历文件对象。这是内存效率高,速度快,并且可以实现简单的代码:

for line in f:
    print line,

This is the first line of the file.
Second line of the file

答案 2 :(得分:0)

请注意,readline()不能与在for循环中读取所有行的情况相提并论,因为它逐行读取并且已经有其他人指出了开销。

我在两个相同的代码片段上运行timeit,但其中一个带有for循环,另一个带有readlines()。您可以在下面看到我的代码段:

  
def test_read_file_1():  
    f = open('ml/README.md', 'r')  
    for line in f.readlines():  
        print(line)  
  
  
def test_read_file_2():  
    f = open('ml/README.md', 'r')  
    for line in f:  
        print(line)  
  
  
def test_time_read_file():  
    from timeit import timeit  
  
    duration_1 = timeit(lambda: test_read_file_1(), number=1000000)  
    duration_2 = timeit(lambda: test_read_file_2(), number=1000000)  
  
    print('duration using readlines():', duration_1)  
    print('duration using for-loop:', duration_2)

结果:

duration using readlines(): 78.826229238
duration using for-loop: 69.487692794

我想说,for循环的底线更快,但如果两者都有可能,我宁愿readlines()

答案 3 :(得分:0)

readline()for line in file 更好,例如当您知道您感兴趣的数据从第 2 行开始时。你可以简单地写readline()[1:]

此类用例是当您有一个制表符/逗号分隔值文件并且第一行是标题(并且您不想为 tsv 或 csv 文件使用其他模块时)。

答案 4 :(得分:-1)

Eesssketit

这是一个很好的答案。 /有一点需要知道的是,无论你使用readline()函数,它都会读取一行.....然后它将无法再次读取它。您可以使用seek()功能返回到该位置。要回到零位,只需输入f.seek(0)即可。

类似地,函数f.tell()会让你知道你在哪个位置。