如何在Python中读取文件的每一行并将每一行存储为列表中的元素?
我想逐行读取文件,并将每一行追加到列表的末尾。
1 2 3 4 5 | with open(fname) as f: content = f.readlines() # you may also want to remove whitespace characters like ` ` at the end of each line content = [x.strip() for x in content] |
见输入和输出:
1 2 | with open('filename') as f: lines = f.readlines() |
或者去掉换行符:
1 2 | lines = [line.rstrip(' ') for line in open('filename')] |
Editor's note:正如Janus Troelsen的评论所暗示的,这个答案的原始空格剥离命令
这比必要的更明确,但是做了您想做的。
1 2 3 4 | with open("file.txt","r") as ins: array = [] for line in ins: array.append(line) |
这将从文件中生成一个"数组"行。
1 | lines = tuple(open(filename, 'r')) |
如果你想包含
1 2 | with open(fname) as f: content = f.readlines() |
如果你不想包含
1 2 | with open(fname) as f: content = f.read().splitlines() |
按照建议,您可以简单地执行以下操作:
1 2 | with open('/your/path/file') as f: my_lines = f.readlines() |
注意这种方法有两个缺点:
你把所有的行都存储在内存中。在一般情况下,这是一个非常糟糕的主意。文件可能非常大,您可能会耗尽内存。即使它不是很大,也只是浪费内存。
这并不允许在您阅读每一行时处理它们。因此,如果您在此之后处理您的行,那么效率就不高(需要两次传递而不是一次)。
对于一般情况,较好的办法是:
1 2 3 | with open('/your/path/file') as f: for line in f: process(line) |
您可以任意定义流程函数。例如:
1 2 3 | def process(line): if 'save the world' in line.lower(): superman.save_the_world() |
(
这将很好地工作,任何大小的文件,你通过你的文件在短短一个通行证。这就是泛型解析器的典型工作方式。
如果你不关心关闭文件,这一行代码可以:
1 | lines = open('file.txt').readlines() |
传统的方法:
1 2 3 4 | fp = open('file.txt') # Open file on read mode lines = fp.read().split(" ") # Create a list containing all lines fp.close() # Close file |
使用
1 2 | with open('file.txt') as fp: lines = fp.readlines() |
数据列表
假设我们有一个文本文件与我们的数据如下行:
文本文件内容:
1 2 3 | line 1 line 2 line 3 |
在相同的目录中打开cmd(右键单击鼠标并选择cmd或PowerShell)运行
的Python脚本
1 2 3 4 | >>> with open("myfile.txt", encoding="utf-8") as file: ... x = [l.strip() for l in file] >>> x ['line 1','line 2','line 3'] |
使用附加
1 2 3 4 | x = [] with open("myfile.txt") as file: for l in file: x.append(l.strip()) |
或…
1 2 3 | >>> x = open("myfile.txt").read().splitlines() >>> x ['line 1', 'line 2', 'line 3'] |
或…
1 2 3 4 5 6 | >>> x = open("myfile.txt").readlines() >>> x ['linea 1 ', 'line 2 ', 'line 3 '] |
或…
1 2 3 4 5 6 7 8 9 10 11 12 | >>> y = [x.rstrip() for x in open("my_file.txt")] >>> y ['line 1','line 2','line 3'] with open('testodiprova.txt', 'r', encoding='utf-8') as file: file = file.read().splitlines() print(file) with open('testodiprova.txt', 'r', encoding='utf-8') as file: file = file.readlines() print(file) |
这应该封装open命令。
1 2 3 4 | array = [] with open("file.txt","r") as f: for line in f: array.append(line) |
将文件行读入列表的一种简洁的python方法
首先,也最重要的是,您应该专注于打开文件并以一种高效且符合python的方式读取其内容。下面是我个人不喜欢的一个例子:
1 2 3 4 5 | 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 '。"一旦密码进去了此语句已运行完毕,文件将自动关闭。
1 2 3 4 | # 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()方法如下:
1 2 | # Return a list of the lines, breaking at line boundaries. my_list = data.splitlines() |
最终产品:
1 2 3 4 5 6 7 | # 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() |
测试代码:
文本文件内容:1 2 3 4 | A fost odat? ca-n povesti, A fost ca niciodat?, Din rude m?ri ?mp?r?testi, O prea frumoas? fat?. |
打印测试语句:
1 2 3 4 5 6 7 8 | 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字符不同,外观不同):
1 2 3 4 5 6 7 8 | ['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?. |
要将文件读入列表,您需要做三件事:
打开文件读取文件将内容存储为列表幸运的是,Python使这些事情变得非常容易,所以将文件读入列表的捷径是:
1 | lst = list(open(filename)) |
不过,我将添加更多的解释。
打开文件
我假设您想打开一个特定的文件,而不是直接处理文件句柄(或类似文件的句柄)。在Python中打开文件最常用的函数是
文件名应该是表示文件路径的字符串。例如:
1 2 3 4 | open('afile') # opens the file named afile in the current working directory open('adir/afile') # relative path (relative to the current working directory) open('C:/users/aname/afile') # absolute path (windows) open('/usr/local/afile') # absolute path (linux) |
注意,需要指定文件扩展名。这对Windows用户尤其重要,因为像
第二个参数是
但是,如果您确实想创建一个文件和/或写入一个文件,这里需要一个不同的参数。如果你想要一个概述,有一个很好的答案。
读取文件时,可以省略
1 2 | open(filename) open(filename, 'r') |
两者都将以只读模式打开文件。如果你想在Windows上读取二进制文件,你需要使用模式
1 | open(filename, 'rb') |
在其他平台上,
现在我已经展示了如何处理
而你可以用:
1 2 3 | f = open(filename) # ... do stuff with f f.close() |
当
1 2 3 4 5 6 | f = open(filename) # nothing in between! try: # do stuff with f finally: f.close() |
但是Python提供了语法更漂亮的上下文管理器(但是对于
1 2 3 | with open(filename) as f: # do stuff with f # The file is always closed after the with-scope ends. |
最后一种方法是用Python打开文件的推荐方法!
读取文件
好了,你已经打开了文件,现在怎么读呢?
函数返回一个
1 2 3 | with open(filename) as f: for line in f: print(line) |
这将打印文件的每一行。但是请注意,每一行的末尾都包含一个换行符
或在Mac上使用
1 2 3 | with open(filename) as f: for line in f: print(line[:-1]) |
但最后一行不一定有换行符,所以不应该用它。可以检查它是否以换行符结尾,如果以换行符结尾,则删除它:
1 2 3 4 5 6 | with open(filename) as f: for line in f: if line.endswith(' '): line = line[:-1] print(line) |
但你可以简单地删除字符串末尾的所有空格(包括
1 2 3 | with open(filename) as f: for line in f: print(f.rstrip()) |
但是,如果行以
结束(Windows"newlines"),那么
现在您已经知道了如何打开文件并读取它,现在是时候将内容存储到列表中了。最简单的选择是使用
1 2 | with open(filename) as f: lst = list(f) |
如果你想去掉后面的换行符,你可以使用列表理解:
1 2 | with open(filename) as f: lst = [line.rstrip() for line in f] |
或者更简单:
1 2 | with open(filename) as f: lst = f.readlines() |
这还将包括尾随的换行符,如果您不需要它们,我建议使用
还有一个额外的选项来获得想要的输出,但是它相当"次优":
1 2 3 | with open(filename) as f: lst = f.read().split(' ') |
或者:
1 2 | with open(filename) as f: lst = f.read().splitlines() |
因为没有包含
总结打开文件时使用
我会这样做。
1 2 3 4 | lines = [] with open("myfile.txt") as f: for line in f: lines.append(line) |
这里还有一个选项是对文件使用列表理解;
1 | lines = [line.rstrip() for line in open('file.txt')] |
这应该是更有效的方法,因为大部分工作是在Python解释器中完成的。
另一个选项是
1 2 3 | import numpy as np data = np.genfromtxt("yourfile.dat",delimiter=" ") |
这将使
如果你想从命令行或stdin中读取文件,你也可以使用
1 2 3 4 5 6 7 8 | # reader.py import fileinput content = [] for line in fileinput.input(): content.append(line.strip()) fileinput.close() |
将文件像这样传递给它:
1 | $ python reader.py textfile.txt |
更多信息请访问:http://docs.python.org/2/library/fileinput.html
最简单的方法
一个简单的方法是:
将整个文件作为字符串读取逐行分割字符串在一行中,这将给出:
1 | lines = open('C:/path/file.txt').read().splitlines() |
用python2和python3读写文本文件;它适用于Unicode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/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(' '.join(lines)) # Read text file with open('file.txt', 'r') as fp: read_lines = fp.readlines() read_lines = [line.rstrip(' ') for line in read_lines] print(lines == read_lines) |
事情要注意:
公共文件结尾
对于你的申请,以下几点可能很重要:
其他编程语言的支持阅读/写作表现密实度(文件大小)参见:数据序列化格式的比较
如果您正在寻找一种生成配置文件的方法,那么您可能想要阅读我的用Python编写的简短文章配置文件。
在Python 3.4中引入的
1 2 3 | from pathlib import Path p = Path('my_text_file') lines = p.read_text().splitlines() |
(
1 2 | f = open("your_file.txt",'r') out = f.readlines() # will append in the list out |
变量out是你想要的列表(数组)。你可以这样做:
1 2 | for line in out: print line |
或
1 2 | for line in f: print line |
你会得到同样的结果。
只需使用splitlines()函数。这里有一个例子。
1 2 3 4 5 6 | inp ="file.txt" data = open(inp) dat = data.read() lst = dat.splitlines() print lst # print(lst) # for python 3 |
在输出中,您将得到行列表。
一个真正简单的方法:
1 2 | with open(file) as g: stuff = g.readlines() |
如果你想让它成为一个成熟的程序,请输入以下内容:
1 2 3 4 5 | file = raw_input ("Enter EXACT file name:") with open(file) as g: stuff = g.readlines() print (stuff) exit = raw_input("Press enter when you are done.") |
由于某些原因,它不能正确读取.py文件。
你可以打开你的文件阅读使用:
1 2 3 4 | file1 = open("filename","r") # And for reading use lines = file1.readlines() file1.close() |
列表
如果你想要面临一个非常大的/大量文件和想读得更快(想象你在一个Topcoder / Hackerrank编码竞争),你可能会相当大一部分行读入内存缓冲区,而不是在文件级别逐行进行迭代。
1 2 3 4 5 6 7 8 | buffersize = 2**16 with open(path) as f: while True: lines_buffer = f.readlines(buffersize) if not lines_buffer: break for line in lines_buffer: process(line) |
据我所知,Python没有原生数组数据结构。但是它支持列表数据结构,使用起来比数组简单得多。
1 2 3 4 | array = [] #declaring a list with name '**array**' with open(PATH,'r') as reader : for line in reader : array.append(line) |
你可以很容易地做到这一点,由以下一段代码:
1 | lines = open(filePath).readlines() |
用这个:
1 2 3 | import pandas as pd data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc. array = data.values |
您还可以在NumPy中使用loadtxt命令。这比genfromtxt检查更少的条件,所以它可能更快。
1 2 3 | import numpy data = numpy.loadtxt(filename, delimiter=" ") |
最简单的方法是:
1 | lines = list(open('filename')) |
或
1 | lines = tuple(open('filename')) |
或
1 | lines = set(open('filename')) |
在使用
看看这个小片段
1 2 | fileOb=open("filename.txt","r") data=fileOb.readlines() #returns a array of lines. |
或
1 2 | fileOb=open("filename.txt","r") data=list(fileOb) #returns a array of lines. |
参考文献
<
大纲和总结/ hh2 >
使用
我将在下面解释每种方法的用例。
In Python, how do I read a file line-by-line?
这是个很好的问题。首先,让我们创建一些示例数据:
1 2 3 4 | from pathlib import Path Path('filename').write_text('foo bar baz') |
文件对象是惰性迭代器,因此只需对其进行迭代。
1 2 3 4 | filename = 'filename' with open(filename) as f: for line in f: line # do something with the line |
或者,如果您有多个文件,使用
1 2 3 4 | import fileinput for line in fileinput.input(filename): line # process the line |
或者对于多个文件,传递一个文件名列表:
1 2 | for line in fileinput.input([filename]*2): line # process the line |
同样,上面的
In Python, how do I read a file line-by-line into a list?
但出于某种原因你想把它列在列表里?如果可能的话,我会尽量避免。但如果你坚持……只需将
1 | list(fileinput.input(filename)) |
另一个直接的答案是调用
有两种方法可以访问这个file对象。一种方法是将文件名传递给
1 2 3 4 | filename = 'filename' with open(filename) as f: f.readlines() |
或者使用来自
1 2 3 4 5 6 | from pathlib import Path path = Path(filename) with path.open() as f: f.readlines() |
1 2 | with path.open() as f: list(f) |
如果您不介意在拆分之前将整个文本作为一个字符串读入内存,那么您可以使用
1 | path.read_text().splitlines() |
如果您想保留换行,传递
1 | path.read_text().splitlines(keepends=True) |
I want to read the file line by line and append each line to the end of the list.
考虑到我们已经用几种方法轻松地演示了最终结果,现在要求这样做有点傻。但是您可能需要在列出列表时对这些行进行过滤或操作,所以让我们来处理这个请求。
使用
1 2 3 4 5 | line_list = [] for line in fileinput.input(filename): line_list.append(line) line_list |
使用
1 2 3 | line_list = [] line_list.extend(fileinput.input(filename)) line_list |
或者更通俗地说,我们可以使用列表理解,并在其中映射和过滤(如果需要的话):
1 | [line for line in fileinput.input(filename)] |
或者更直接地,要关闭这个圆圈,只需将它传递给list,就可以直接创建一个新的list,而不需要对行进行操作:
1 | list(fileinput.input(filename)) |
结论
您已经看到了将文件中的行放入列表的许多方法,但是我建议您避免将大量数据物化到列表中,而是尽可能使用Python的延迟迭代来处理数据。
也就是说,更喜欢
命令行版本
1 2 3 4 5 6 7 8 9 | #!/bin/python3 import os import sys abspath = os.path.abspath(__file__) dname = os.path.dirname(abspath) filename = dname + sys.argv[1] arr = open(filename).read().split(" ") print(arr) |
运行:
1 | python3 somefile.py input_file_name.txt |
我喜欢用下面这些。马上读台词。
1 2 3 | contents = [] for line in open(filepath, 'r').readlines(): contents.append(line.strip()) |
或者使用列表理解:
1 | contents = [line.strip() for line in open(filepath, 'r').readlines()] |
我将尝试下面提到的方法之一。我使用的示例文件名为
在下面的两个例子中,您想要的列表由
1.>第一个方法:
1 2 3 4 5 6 | fpath = 'dummy.txt' with open(fpath,"r") as f: lst = [line.rstrip(' \t') for line in f] print lst >>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.'] |
2.在第二种方法中,可以使用csv。Python标准库的reader模块:
1 2 3 4 5 6 7 8 | import csv fpath = 'dummy.txt' with open(fpath) as csv_file: csv_reader = csv.reader(csv_file, delimiter=' ') lst = [row[0] for row in csv_reader] print lst >>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.'] |
您可以使用这两种方法中的任何一种。在这两种方法中,创建
如果文档中还有空行,我喜欢在内容中读取并通过
1 2 | with open(myFile,"r") as f: excludeFileContent = list(filter(None, f.read().splitlines())) |