TL;DR;
考虑到您之后需要一个列表来操作它们,您提出的三个解决方案在语法上都是有效的。没有更好(或更 Pythonic) 的解决方案,尤其是它们都被官方 Python documentation 推荐。因此,请选择您认为最易读并在整个代码中保持一致的那个。如果性能是决定性因素,请参阅下面我的timeit 分析。
这是timeit(10000 个循环,test.txt 中的 ~20 行),
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
我尝试了多个循环和行,f.read().splitlines(True) 的性能似乎总是比其他两个好一点。
现在,从句法上讲,您的所有示例似乎都是有效的。有关更多信息,请参阅此documentation。
据此,如果您的目标是从文件中读取行,
for line in f:
...
他们声称它内存效率高、速度快并且代码简单。 如果您不需要在列表中操作它们,这将是另一个不错的选择。
编辑
请注意,您无需将 True 布尔值传递给 splitlines。默认情况下,它具有您想要的行为。
我的个人建议
我不想让这个答案过于基于意见,但我认为这对你来说是有益的,我认为性能不应该是你的决定因素,直到它实际上对你来说是一个问题。特别是因为在我链接的官方 Python 文档中允许并推荐所有语法。
所以,我的建议是:
首先,根据您的具体情况选择最合乎逻辑的,然后选择您认为最易读并保持一致的那个贯穿你的代码。