如何在Python中读取文件的每一行,并将每一行存储为列表中的元素?
我想逐行读取文件,并将每一行附加到列表的末尾。
如何在Python中读取文件的每一行,并将每一行存储为列表中的元素?
我想逐行读取文件,并将每一行附加到列表的末尾。
当前回答
要将文件读取到列表中,需要执行以下三项操作:
打开文件读取文件将内容存储为列表
幸运的是,Python非常容易做到这些,所以将文件读入列表的最短方法是:
lst = list(open(filename))
不过,我会补充一些解释。
打开文件
我假设您想打开一个特定的文件,而不直接处理文件句柄(或类似文件的句柄)。Python中最常用的打开文件的函数是open,在Python 2.7中它需要一个强制参数和两个可选参数:
文件名模式缓冲(我将忽略这个答案中的这个参数)
文件名应该是表示文件路径的字符串。例如:
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用户尤其重要,因为在浏览器中查看时,默认情况下,.txt或.doc等文件扩展名是隐藏的。
第二个参数是mode,默认为r,表示“只读”。这正是你需要的。
但如果你真的想要创建一个文件和/或写入一个文件,你需要一个不同的参数。如果你想要一个概览,有一个很好的答案。
对于读取文件,可以省略模式或显式传入:
open(filename)
open(filename, 'r')
两者都将以只读模式打开文件。如果您想在Windows上读取二进制文件,则需要使用模式rb:
open(filename, 'rb')
在其他平台上,“b”(二进制模式)被简单地忽略。
既然我已经演示了如何打开该文件,那么让我们来谈谈您总是需要再次关闭它的事实。否则,它将保持文件的打开文件句柄,直到进程退出(或Python破坏文件句柄)。
虽然您可以使用:
f = open(filename)
# ... do stuff with f
f.close()
当打开和关闭之间发生异常时,将无法关闭文件。您可以通过尝试并最终:
f = open(filename)
# nothing in between!
try:
# do stuff with f
finally:
f.close()
然而,Python提供的上下文管理器具有更漂亮的语法(但对于open,它几乎与上面的try和finally相同):
with open(filename) as f:
# do stuff with f
# The file is always closed after the with-scope ends.
最后一种方法是用Python打开文件的推荐方法!
正在读取文件
好的,你已经打开了文件,现在如何阅读?
open函数返回一个文件对象,它支持Pythons迭代协议。每次迭代都会给你一行:
with open(filename) as f:
for line in f:
print(line)
这将打印文件的每一行。但是,请注意,每一行结尾都将包含一个换行符(您可能需要检查Python是否具有通用换行符支持,否则您也可以在Windows或Mac上使用换行符)。如果您不想这样做,可以简单地删除最后一个字符(或Windows上的最后两个字符):
with open(filename) as f:
for line in f:
print(line[:-1])
但最后一行不一定有换行符,所以不应该使用它。可以检查它是否以尾随换行符结尾,如果是,请将其删除:
with open(filename) as f:
for line in f:
if line.endswith('\n'):
line = line[:-1]
print(line)
但是您可以简单地删除字符串末尾的所有空格(包括字符),这也会删除所有其他尾随空格,因此如果这些空格很重要,您必须小心:
with open(filename) as f:
for line in f:
print(f.rstrip())
但是,如果行以\r\n(Windows“newlines”)结尾,.rstrip()也会处理\r!
将内容存储为列表
既然您知道了如何打开文件并读取它,现在是将内容存储在列表中的时候了。最简单的选择是使用list函数:
with open(filename) as f:
lst = list(f)
如果你想去掉后面的换行符,你可以使用列表理解:
with open(filename) as f:
lst = [line.rstrip() for line in f]
或者更简单:默认情况下,file对象的.readlines()方法返回一个行列表:
with open(filename) as f:
lst = f.readlines()
这还将包括后面的换行符,如果你不想要它们,我建议使用[line.rstrip()for line-in-f]方法,因为它避免了在内存中保留包含所有行的两个列表。
有一个额外的选项可以获得所需的输出,但它相当“次优”:读取字符串中的完整文件,然后在换行符上拆分:
with open(filename) as f:
lst = f.read().split('\n')
or:
with open(filename) as f:
lst = f.read().splitlines()
因为不包含拆分字符,所以它们会自动处理尾随换行符。然而,它们并不理想,因为您将文件保存为字符串和内存中的行列表!
总结
在打开文件时使用with open(…)作为f,因为您不需要自己关闭文件,即使发生异常,它也会关闭文件。文件对象支持迭代协议,因此逐行读取文件与file_object:中的行一样简单。始终浏览文档以查找可用的函数/类。大多数时候,这项任务有一个完美的匹配,或者至少有一两个好的匹配。在这种情况下,明显的选择是readlines(),但如果您想在将行存储在列表中之前处理它们,我建议您进行简单的列表理解。
其他回答
f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out
现在,变量out是您想要的列表(数组)。您可以选择:
for line in out:
print (line)
Or:
for line in f:
print (line)
你会得到同样的结果。
如果要包含以下内容:
with open(fname) as f:
content = f.readlines()
如果不希望包含:
with open(fname) as f:
content = f.read().splitlines()
如果文档中也有空行,我希望读取内容并将其通过过滤器以防止空字符串元素
with open(myFile, "r") as f:
excludeFileContent = list(filter(None, f.read().splitlines()))
根据Python的文件对象方法,将文本文件转换为列表的最简单方法是:
with open('file.txt') as f:
my_list = list(f)
# my_list = [x.rstrip() for x in f] # remove line breaks
演示
如果只需要遍历文本文件行,可以使用:
with open('file.txt') as f:
for line in f:
...
旧答案:
使用with和readline():
with open('file.txt') as f:
lines = f.readlines()
如果您不关心关闭文件,这一行程序将起作用:
lines = open('file.txt').readlines()
传统方式:
f = open('file.txt') # Open file on read mode
lines = f.read().splitlines() # List with stripped line-breaks
f.close() # Close file
使用此项:
import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values
data是一种数据帧类型,使用值获取ndarray。您还可以使用array.tolist()获取列表。