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

Python 我什么时候应该使用file.read()或file.readlines()?,python,io,timeit,Python,Io,Timeit,我注意到,如果我对打开的文件进行迭代,在不“读取”的情况下对其进行迭代要快得多 i、 e 比以前快多了 l = open('file','r') for line in l.read() / l.readlines(): pass (or code) 第二个循环将花费大约1.5倍的时间(我在完全相同的文件上使用了timeit,结果是0.442对0.660),并将给出相同的结果 那么-我什么时候应该使用.read()或.readlines() 由于我总是需要遍历正在读取的文件,并且在艰难

我注意到,如果我对打开的文件进行迭代,在不“读取”的情况下对其进行迭代要快得多

i、 e

比以前快多了

l = open('file','r')
for line in l.read() / l.readlines():
    pass (or code)
第二个循环将花费大约1.5倍的时间(我在完全相同的文件上使用了timeit,结果是0.442对0.660),并将给出相同的结果

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

由于我总是需要遍历正在读取的文件,并且在艰难地学习了.read()在大数据上的速度有多慢之后,我似乎无法想象再次使用它

希望这有帮助

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

对不起,所有的编辑

要从文件中读取行,可以在文件对象上循环。这是一种高效、快速的内存管理方法,并可生成简单的代码:


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

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

如问题中所述,使用f:中的行语法
,用户可以逐行迭代文件

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

注: 先前有人声称,
f.readline()
可用于在for循环迭代期间跳过一行。但是,这在Python2.7中不起作用,并且可能是一种有问题的做法,因此此声明已被删除。

eessskett

这是一个极好的回答值得一提的是,无论何时使用readline()函数,它都会读取一行。。。。。然后它就不能再读了。您可以使用
seek()
函数返回到该位置。要返回零位,只需输入
f.seek(0)

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

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

我在两个相同的snippt上运行了
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()

readline()
for file中的line
更好,因为您知道感兴趣的数据是从第二行开始的,例如第二行。您只需编写
readline()[1:][/code>


当您有一个以制表符/逗号分隔的值文件,第一行是一个标题(并且您不想为tsv或csv文件使用其他模块)时,就会出现这种情况。

请澄清。
timeit
测量值是用于
read
,还是用于
readlines
?我希望
read
循环需要更长的时间,因为它只返回一个字符串,所以对它进行逐个字符的迭代。如果您的文件平均每行包含100个字符,则
for line in l.read()
循环中的代码执行次数将是
for line in l:
循环中的代码执行次数的100倍。它也适用于readlines()。令人惊讶的是,read()和readlines()之间几乎没有时间差……这不是C或Python API的准确描述。我想我不会很好地解释它,这就是为什么我直接从文档中提取其余答案的原因。C不会默认逐行读取文件。在C语言中甚至没有一个标准的逐行读取文件的函数
getline
是POSIX扩展。另外,循环
f.read()
不会在每次迭代时读取整个文件,也不会在行上迭代。我指的不是getline,而是fscanf。去年我使用CS108时,它确实读取了,不确定它何时更改,但我一定会仔细研究一下。在文件上混合使用
readline
for
循环实际上是行不通的
readline
不理解
next
实现的缓冲。如果你想跳过
for
循环中的一行,你应该调用文件中的
next
。readline()似乎将循环缓冲区向前移动。让我检查一下Python2真的很快啊,你对Python2.7是正确的。我将编辑我的答案。谢谢,很高兴知道!你能举一个实际使用read()的例子吗?我能想到的唯一一个方法是,如果您在文件中存储密码,并且希望读取它,那么使用.read()将比文件代码中的for l快一点。但对于任何正常大小的文件…?添加。那个例子有助于澄清你的问题吗?如果需要的话,我可以举一个更有根据的例子。
  
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