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)?
显式优于隐式,所以我更喜欢:
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)
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 文档中允许并推荐所有语法。
所以,我的建议是:
首先,为您的特定情况选择最合乎逻辑的一个,然后选择您认为最具可读性的一个,并在整个代码中保持一致。