之间存在区别:"file.readlines()","list(file)"和"file.read().splitlines(True)"?

Ber*_*uda 8 python file list readlines

有什么区别:

with open("file.txt", "r") as f:
    data = list(f)
Run Code Online (Sandbox Code Playgroud)

要么 :

with open("file.txt", "r") as f:
    data = f.read().splitlines(True)
Run Code Online (Sandbox Code Playgroud)

要么 :

with open("file.txt", "r") as f:
    data = f.readlines()
Run Code Online (Sandbox Code Playgroud)

它们似乎产生完全相同的输出.一个比另一个更好(或更pythonic)?

Gel*_*eau 7

显式优于隐式,所以我更喜欢:

with open("file.txt", "r") as f:
    data = f.readlines()
Run Code Online (Sandbox Code Playgroud)

但是,当有可能时,最pythonic是直接使用文件迭代器,而不将所有内容加载到内存,例如:

with open("file.txt", "r") as f:
    for line in f:
       my_function(line)
Run Code Online (Sandbox Code Playgroud)

  • @Bermuda:`firstline = next(f)`.然后做它的东西.然后`with open("file.txt.temp","r")为f2:f2.write(f.read())`.然后将`file.txt.temp`移到`file.txt`上. (3认同)

sch*_*tte 5

TL;博士;

考虑到您需要一个列表来随后操作它们,您提出的三个解决方案在语法上都是有效的。没有更好(或更Pythonic)的解决方案,特别是因为它们都是官方Python文档推荐的。因此,选择您认为最具可读性的一个,并在整个代码中保持一致。如果性能是决定因素,请参阅timeit下面我的分析。


这是timeit(10000 个循环,~20 行test.txt),

import timeit

def foo():
    with open("test.txt", "r") as f:
        data = list(f)

def foo1():
    with open("test.txt", "r") as f:
        data = f.read().splitlines(True)

def foo2():
    with open("test.txt", "r") as f:
        data = f.readlines()

print(timeit.timeit(stmt=foo, number=10000))
print(timeit.timeit(stmt=foo1, number=10000))
print(timeit.timeit(stmt=foo2, number=10000))

>>>> 1.6370758459997887
>>>> 1.410844805999659
>>>> 1.8176437409965729
Run Code Online (Sandbox Code Playgroud)

我尝试了多个循环和线路,并且f.read().splitlines(True)似乎总是比其他两个表现得更好一些。

现在,从语法上来说,你所有的例子似乎都是有效的。参考这个文档以获取更多信息。

根据它,如果你的目标是读取文件中的行,

for line in f:
    ...
Run Code Online (Sandbox Code Playgroud)

他们指出它内存效率高、速度快并且代码简单如果您不需要在列表中操作它们,那么这将是您的情况的另一个不错的选择。

编辑

请注意,您不需要将True布尔值传递给splitlines传递给. 默认情况下它具有您想要的行为。

我个人的推荐

我不想让这个答案过于基于观点,但我认为这对你来说是有益的,我认为性能不应该成为你的决定因素,直到它对你来说实际上是一个问题。特别是因为我链接的官方 Python 文档中允许并推荐所有语法。

所以,我的建议是:

首先,为您的特定情况选择最合乎逻辑的一个,然后选择您认为最具可读性的一个,并在整个代码中保持一致。