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

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


当前回答

使用Python 2和Python 3读写文本文件;它适用于Unicode

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Define data
lines = ['     A first string  ',
         'A Unicode sample: €',
         'German: äöüß']

# Write text file
with open('file.txt', 'w') as fp:
    fp.write('\n'.join(lines))

# Read text file
with open('file.txt', 'r') as fp:
    read_lines = fp.readlines()
    read_lines = [line.rstrip('\n') for line in read_lines]

print(lines == read_lines)

注意事项:

with是所谓的上下文管理器。它确保打开的文件再次关闭。这里的所有解决方案,只要简单地生成.strip()或.rstrip(),就无法再现线条,因为它们也会剥离空白。

常用文件结尾

.txt

更高级的文件写入/读取

CSV:超简单格式(读写)JSON:适合编写人类可读数据;非常常用(读写)YAML:YAML是JSON的超集,但更易于阅读(读写,JSON和YAML的比较)pickle:Python序列化格式(读写)MessagePack(Python包):更紧凑的表示(读写)HDF5(Python包):适合矩阵(读写)XML:也存在*叹息*(读写)

对于您的应用程序,以下内容可能很重要:

其他编程语言的支持读/写性能紧凑性(文件大小)

另请参阅:数据序列化格式的比较

如果您正在寻找创建配置文件的方法,您可能需要阅读我的Python配置文件短文。

其他回答

这比必要的更明确,但可以做到你想要的。

with open("file.txt") as file_in:
    lines = []
    for line in file_in:
        lines.append(line)

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

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

open返回一个可以迭代的文件。当您遍历一个文件时,您会从该文件中获取行。tuple可以使用迭代器,并从您给它的迭代器中为您实例化一个tuple实例。

这段代码将把整个文件读入内存,并删除每行末尾的所有空白字符(换行符和空格):

with open(filename) as file:
    lines = [line.rstrip() for line in file]

如果您正在处理一个大文件,那么您应该逐行读取并处理它:

with open(filename) as file:
    for line in file:
        print(line.rstrip())

在Python 3.8及以上版本中,可以使用while循环和walrus运算符,如下所示:

with open(filename) as file:
    while (line := file.readline().rstrip()):
        print(line)

根据您计划对文件执行的操作以及文件的编码方式,您可能还需要手动设置访问模式和字符编码:

with open(filename, 'r', encoding='UTF-8') as file:
    while (line := file.readline().rstrip()):
        print(line)

大纲和摘要

使用文件名,从Path(filename)对象处理文件,或直接将open(filename)作为f,执行以下操作之一:

列表(fileinput.input(文件名))使用path.open()作为f,调用f.readlines()列表(f)path.read_text().splitline()path.read_text().splitlines(keepends=True)迭代fileinput.input或f和list.append每行一次将f传递给绑定的list.extend方法在列表理解中使用f

我将在下面解释每一个的用例。

在Python中,如何逐行读取文件?

这是一个很好的问题。首先,让我们创建一些示例数据:

from pathlib import Path
Path('filename').write_text('foo\nbar\nbaz')

文件对象是惰性迭代器,所以只需对其进行迭代。

filename = 'filename'
with open(filename) as f:
    for line in f:
        line # do something with the line

或者,如果您有多个文件,请使用另一个惰性迭代器fileinput.input。只有一个文件:

import fileinput

for line in fileinput.input(filename): 
    line # process the line

或者对于多个文件,向其传递文件名列表:

for line in fileinput.input([filename]*2): 
    line # process the line

同样,上面的f和fileinput.input都是/return惰性迭代器。您只能使用一次迭代器,因此为了在提供函数代码的同时避免冗长,我将在此处使用稍微简洁的fileinput.input(文件名)。

在Python中,如何将文件逐行读入列表?

啊,但出于某种原因,你想把它列在列表中?如果可能的话,我会避免。但如果你坚持。。。只需将fileinput.input(文件名)的结果传递给列表:

list(fileinput.input(filename))

另一个直接的答案是调用f.readlines,它返回文件的内容(最多为可选的提示字符数,因此您可以这样将其分解为多个列表)。

您可以通过两种方式访问此文件对象。一种方法是将文件名传递给打开的内置程序:

filename = 'filename'

with open(filename) as f:
    f.readlines()

或者使用pathlib模块中的新Path对象(我已经非常喜欢它,并将从这里开始使用):

from pathlib import Path

path = Path(filename)

with path.open() as f:
    f.readlines()

list还将使用文件迭代器并返回一个列表-这也是一个非常直接的方法:

with path.open() as f:
    list(f)

如果您不介意在拆分之前将整个文本作为一个字符串读入内存,那么可以使用Path对象和splitlines()字符串方法将其作为一行代码。默认情况下,拆分线会删除换行符:

path.read_text().splitlines()

如果要保留换行符,请传递keepends=True:

path.read_text().splitlines(keepends=True)

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

现在,考虑到我们已经用几种方法轻松地演示了最终结果,这一要求有点愚蠢。但在列出列表时,您可能需要对行进行筛选或操作,所以让我们来幽默一下这个请求。

使用list.append可以在附加每一行之前对其进行筛选或操作:

line_list = []
for line in fileinput.input(filename):
    line_list.append(line)

line_list

使用list.extend会更直接一些,如果您有一个预先存在的列表,可能会有用:

line_list = []
line_list.extend(fileinput.input(filename))
line_list

或者更惯用地说,我们可以使用列表理解,并根据需要在其中进行映射和过滤:

[line for line in fileinput.input(filename)]

或者更直接地,要关闭圆,只需将其传递到列表即可直接创建新列表,而无需对行进行操作:

list(fileinput.input(filename))

结论

您已经看到了许多将文件中的行放入列表的方法,但我建议您避免将大量数据具体化到列表中,而是尽可能使用Python的惰性迭代来处理数据。

也就是说,首选fileinput.input或path.open()作为f。

具有文本文件内容:

line 1
line 2
line 3

我们可以在上面txt的同一目录中使用此Python脚本

>>> with open("myfile.txt", encoding="utf-8") as file:
...     x = [l.rstrip("\n") for l in file]
>>> x
['line 1','line 2','line 3']

使用追加:

x = []
with open("myfile.txt") as file:
    for l in file:
        x.append(l.strip())

Or:

>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1', 'line 2', 'line 3']

Or:

>>> x = open("myfile.txt").readlines()
>>> x
['linea 1\n', 'line 2\n', 'line 3\n']

Or:

def print_output(lines_in_textfile):
    print("lines_in_textfile =", lines_in_textfile)

y = [x.rstrip() for x in open("001.txt")]
print_output(y)

with open('001.txt', 'r', encoding='utf-8') as file:
    file = file.read().splitlines()
    print_output(file)

with open('001.txt', 'r', encoding='utf-8') as file:
    file = [x.rstrip("\n") for x in file]
    print_output(file)

输出:

lines_in_textfile = ['line 1', 'line 2', 'line 3']
lines_in_textfile = ['line 1', 'line 2', 'line 3']
lines_in_textfile = ['line 1', 'line 2', 'line 3']