如何在Python中读取文件的每一行,并将每一行存储为列表中的元素?
我想逐行读取文件,并将每一行附加到列表的末尾。
如何在Python中读取文件的每一行,并将每一行存储为列表中的元素?
我想逐行读取文件,并将每一行附加到列表的末尾。
当前回答
如果您想从命令行或stdin读取文件,也可以使用fileinput模块:
# reader.py
import fileinput
content = []
for line in fileinput.input():
content.append(line.strip())
fileinput.close()
将文件传递给它,如下所示:
$ python reader.py textfile.txt
在此处阅读更多信息:http://docs.python.org/2/library/fileinput.html
其他回答
大纲和摘要
使用文件名,从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。
这将从文件中生成一个“数组”。
lines = tuple(open(filename, 'r'))
open返回一个可以迭代的文件。当您遍历一个文件时,您会从该文件中获取行。tuple可以使用迭代器,并从您给它的迭代器中为您实例化一个tuple实例。
将文件行读取到列表中的干净和Python方式
首先也是最重要的一点,你应该专注于以一种高效的方式打开文件并阅读其内容。下面是一个我个人不喜欢的方式的例子:
infile = open('my_file.txt', 'r') # Open the file for reading.
data = infile.read() # Read the contents of the file.
infile.close() # Close the file since we're done using it.
相反,我更喜欢以下打开文件的方法,既可以读也可以写非常干净,不需要关闭文件的额外步骤一旦您使用完它。在下面的语句中,我们将打开文件用于读取,并将其分配给变量infile一旦代码在此语句已完成运行,文件将自动关闭。
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
现在我们需要专注于将这些数据引入Python列表,因为它们是可迭代的、高效的和灵活的。在您的案例中,期望的目标是将文本文件的每一行放入一个单独的元素中。为此,我们将使用splitlines()方法,如下所示:
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
最终产品:
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
测试我们的代码:
文本文件的内容:
A fost odatã ca-n povesti,
A fost ca niciodatã,
Din rude mãri împãrãtesti,
O prea frumoasã fatã.
打印测试报表:
print my_list # Print the list.
# Print each line in the list.
for line in my_list:
print line
# Print the fourth element in this list.
print my_list[3]
输出(因unicode字符而不同):
['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
frumoas\xc3\xa3 fat\xc3\xa3.']
A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
împãrãtesti, O prea frumoasã fatã.
O prea frumoasã fatã.
最简单的方法是:
lines = list(open('filename'))
or
lines = tuple(open('filename'))
or
lines = set(open('filename'))
在set的情况下,我们必须记住,我们没有保留行顺序,并删除重复的行。
下面我添加了@MarkAmery的一个重要补充:
由于您既没有在文件对象上调用.close,也没有使用with语句,因此在某些Python实现中,文件在读取后可能不会关闭,您的进程将泄漏打开的文件句柄。在CPython(大多数人使用的普通Python实现)中,这不是问题,因为文件对象将立即被垃圾收集,这将关闭文件,但通常认为最好的做法是:
with open('filename') as f: lines = list(f)
以确保无论您使用的是什么Python实现,文件都会被关闭。
Python 3.4中引入了pathlib,它有一种非常方便的方法来从文件中读取文本,如下所示:
from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()
(splitlines调用将其从包含文件全部内容的字符串转换为文件中的行列表。)
pathlib有很多方便的地方。readtext很好,很简洁,您不必担心打开和关闭文件。如果您只需一次将文件全部读入,这是一个不错的选择。