题 在Python中,如何逐行读取文件到列表中?


如何在Python中读取文件的每一行并将每一行存储为列表中的元素?

我想逐行读取文件,并将每行附加到列表的末尾。


1703
2017-07-18 22:25


起源




答案:


with open(fname) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 

1659
2017-07-18 22:28



不要用 file.readlines() 在一个 for-loop,文件对象本身就足够了: lines = [line.rstrip('\n') for line in file] - jfs
如果您正在使用大数据 readlines() 因为它可能导致效率不高 的MemoryError。在这种情况下,最好使用迭代文件 for line in f: 并与每个人合作 line 变量。 - DarkCygnus
我使用上面提到的程序检查了答案中给出的不同方式的记忆概况 这里。根据@DevShark的建议,从文件中读取每一行并进行处理时,内存使用情况要好得多 这里。保持集合对象中的所有行是 不 如果内存是约束或文件很大,这是一个好主意。两种方法的执行时间都相似。 - Tirtha R
也, .rstrip() 如果你从行的末尾剥去空格,它会稍微快一点。 - Gringo Suave


看到 输入和输出

with open('filename') as f:
    lines = f.readlines()

或者剥离换行符:

lines = [line.rstrip('\n') for line in open('filename')]

编者注:这个答案是原始的空白剥离命令, line.strip()正如Janus Troelsen的评论所暗示的那样,将会删除 所有领先和尾随 空白,而不仅仅是尾随 \n


781
2017-07-18 22:28



如果您只想丢弃换行符: lines = (line.rstrip('\n') for line in open(filename)) - Janus Troelsen
列表应该是 lines = [line.rstrip('\n') for line in open(filename)] - Lazik
第二个选项不会让文件保持打开状态(因为它没有自己的上下文保护)吗? - yo'
@yo'确实如此,但大多数人并不关心小程序。小程序没有坏处,因为泄漏的文件对象是垃圾收集的,但这不是一个好习惯。 - Martin Ueding
更安全: with open('filename') as f: lines = [line.rstrip('\n') for line in f] - becko


这比必要的更明确,但是做你想要的。

with open("file.txt", "r") as ins:
    array = []
    for line in ins:
        array.append(line)

369
2017-07-18 22:27



这是对这个问题的直接回答 - Joop


这将从文件中生成一行“数组”。

lines = tuple(open(filename, 'r'))

206
2017-07-18 22:27



open 返回一个可以迭代的文件。迭代文件时,您将从该文件中获取行。 tuple 可以从你给它的迭代器中获取一个迭代器并为你实例化一个元组实例。 lines 是从文件行创建的元组。 - Noctis Skytower
@MarshallFarrier尝试 lines = open(filename).read().split('\n') 代替。 - Noctis Skytower
它关闭文件? - Vanuan
@NoctisSkytower我找到了 lines = open(filename).read().splitlines() 一点点清洁,我相信它也更好地处理DOS行结尾。 - jaynp
@ mklement0假设一个1000行的文件,一个 list 占用的空间比a大13.22% tuple。结果来自 from sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)。创建一个 tuple 比创建一个节省大约4.17%的时间 list (标准偏差为0.16%)。结果来自跑步 from timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2) 30次。当对可变性的需求未知时,我的解决方案有利于空间超速。 - Noctis Skytower


如果你想要的话 \n 包括:

with open(fname) as f:
    content = f.readlines()

如果你不想要 \n 包括:

with open(fname) as f:
    content = f.read().splitlines()

150
2018-03-02 04:22





您可以简单地执行以下操作,如建议的那样:

with open('/your/path/file') as f:
    my_lines = f.readlines()

请注意,此方法有两个缺点:

1)您将所有行存储在内存中。在一般情况下,这是一个非常糟糕的主意。该文件可能非常大,您可能会耗尽内存。即使它不大,也只是浪费内存。

2)当您阅读时,这不允许处理每一行。因此,如果您在此之后处理您的行,则效率不高(需要两次通过而不是一次)。

对于一般情况,更好的方法如下:

with open('/your/path/file') as f:
    for line in f:
        process(line)

您可以以任何方式定义过程函数。例如:

def process(line):
    if 'save the world' in line.lower():
         superman.save_the_world()

(执行 Superman 课程留给你练习)。

对于任何文件大小,这都可以很好地工作,只需1遍即可完成文件。这通常是通用解析器的工作方式。


93
2018-02-25 09:13



这正是我所需要的 - 并且感谢您解释其缺点。作为Python的初学者,理解为什么解决方案是解决方案真是太棒了。干杯! - Ephexx
想想更多Corey。你真的希望你的计算机读取每一行,而不用这些行吗?当然,你可以意识到你总是需要以某种方式处理它们。 - DevShark
你总是需要对这些线做些什么。它可以像打印线条或计算它们一样简单。让你的进程读取内存中的行,但没有用它做任何事情是没有价值的。 - DevShark
你总是需要对它们做点什么。我认为你要做的一点是,你可能希望立即将一个函数应用于所有这些函数,而不是一个接一个。事实确实如此。但是从存储器的角度来看这是非常低效的,并且如果其足迹大于你的Ram,则会阻止你阅读文件。这就是为什么通常的通用解析器以我描述的方式运行的原因。 - DevShark
@PierreOcinom这是正确的。鉴于文件以只读模式打开,您无法使用上面的代码修改原始文件。要打开文件进行读写,请使用 open('file_path', 'r+') - DevShark


如果你不关心关闭文件,这个单线程工作:

lines = open('file.txt').read().split("\n")

传统 办法:

fp = open('file.txt') # Open file on read mode
lines = fp.read().split("\n") # Create a list containing all lines
fp.close() # Close file

运用 with (推荐的):

with open('file.txt') as fp:
    lines = fp.read().split("\n")

61
2018-04-20 05:53



在某些情况下可能没问题,但即使在循环完成后,这也不会关闭文件 - stackoverflow.com/a/1832589/232593 - Merlyn Morgan-Graham
该 with 块自动关闭文件。不需要决赛 fp.close() 在最后一个例子中排队。看到: repl.it/IMeA/0 - Merlyn Morgan-Graham
一直关心关闭文件!成为一个很好的资源公民! - Nick


这应该封装open命令。

array = []
with open("file.txt", "r") as f:
  for line in f:
    array.append(line)

38
2017-10-28 15:40



f.readlines()也是如此。无需附加到空列表。 - Corey Goldberg
你是对的。如果您想在线上阅读时做某事,这可以提供对解决方案的深入了解。像一些strip / regex转换。 - cevaris