如何将文件逐行读取到列表中?

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

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

答案

with open(filename) 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]

请参阅输入和输出

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

或通过删除换行符:

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

这比必要的要明确,但是可以满足您的要求。

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

这将从文件中产生行的 “数组”。

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

open返回一个可以迭代的文件。遍历文件时,您将从该文件中获取行。 tuple可以使用一个迭代器,并从提供它的迭代器为您实例化一个元组实例。 lines是从文件的各行创建的元组。

如果要包含\n

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

如果您不想包含\n

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

根据 Python 的文件对象方法,将文本文件转换为list的最简单方法是:

with open('file.txt') as f:
    my_list = list(f)

旧答案:

withreadlines()

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().split("\n") # Create a list containing all lines
f.close() # Close file

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

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人类的实现留给您练习)。

这对于任何文件大小都可以很好地工作,而且您只需一遍就可以浏览文件。这通常是通用解析器的工作方式。

数据入列表

假设我们有一个文本文件,其数据如下行所示,

文字档案内容:

line 1
line 2
line 3
  • 在同一目录中打开 cmd(右键单击鼠标,然后选择 cmd 或 PowerShell)
  • 运行python并在解释器中编写:

Python 脚本:

>>> with open("myfile.txt", encoding="utf-8") as file:
...     x = [l.strip() 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())

要么:

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

要么:

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

要么:

>>> 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)

要将文件读入列表,您需要做三件事:

  • 开启档案
  • 读取文件
  • 将内容存储为列表

幸运的是,Python 使执行这些操作变得非常容易,因此将文件读入列表的最短方法是:

lst = list(open(filename))

但是,我将添加更多解释。

打开文件

我假设您要打开特定文件,并且不直接处理文件句柄(或类似文件的句柄)。在 Python 中open文件最常用的功能是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 ,表示 “只读”。这正是您所需要的。

但是,如果您确实要创建文件和 / 或写入文件,则在此处需要使用其他参数。 如果您需要概述,这是一个很好的答案

要读取文件,您可以省略mode或将其显式传递:

open(filename)
open(filename, 'r')

两者都将以只读模式打开文件。如果要在 Windows 上读取二进制文件,则需要使用rb模式:

open(filename, 'rb')

在其他平台上,仅会忽略'b' (二进制模式)。


现在,我已经展示了如何open文件,让我们谈谈您总是需要再次close它这一事实。否则,它将保持对文件的打开文件句柄,直到进程退出(或 Python 丢弃文件句柄)。

虽然您可以使用:

f = open(filename)
# ... do stuff with f
f.close()

openclose之间的异常引发异常时,将无法关闭文件。您可以通过tryfinally避免这种情况:

f = open(filename)
# nothing in between!
try:
    # do stuff with f
finally:
    f.close()

但是,Python 提供了具有更漂亮语法的上下文管理器(但是对于open它几乎与tryfinally完全相同):

with open(filename) as f:
    # do stuff with f
# The file is always closed after the with-scope ends.

最后一种方法是建议使用 Python 打开文件的方法!

读取文件

好的,您已经打开了文件,现在如何读取?

open函数返回一个file对象,它支持 Python 的迭代协议。每次迭代都会给你一行:

with open(filename) as f:
    for line in f:
        print(line)

这将打印文件的每一行。不过请注意,每行包含一个换行符\n末(您可能要检查,如果你的 Python 与内置通用换行符支持 - 否则,你也可以有\r\n在 Windows 或\r作为换行符在 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)

但是您可以简单地从字符串末尾删除所有空格(包括\n字符),这还将删除所有其他尾随空格,因此如果这些空格很重要,则必须小心:

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()方法返回以下行的list

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

这还将包括尾随换行符,如果您不希望它们,我将推荐[line.rstrip() for line in f]方法,因为它避免了在内存中保留包含所有行的两个列表。

还有一个额外的选项来获取所需的输出,但是它是 “次佳的”:以字符串形式read整个文件,然后在换行符上分割:

with open(filename) as f:
    lst = f.read().split('\n')

要么:

with open(filename) as f:
    lst = f.read().splitlines()

因为不包括split字符,所以它们会自动处理尾随的换行符。但是,它们并不理想,因为您将文件保留为字符串和内存中的行列表!

摘要

  • 在打开文件时将with open(...) as f使用with open(...) as f因为您无需自己关闭文件,即使发生某些异常,它也会关闭文件。
  • file对象支持迭代协议,因此逐行读取文件就像for line in the_file_object:的行一样简单。
  • 始终浏览文档以获取可用的功能 / 类。在大多数情况下,任务或至少一个或两个好的任务是一个完美的选择。在这种情况下,显而易见的选择是readlines()但是如果您想在将行存储到列表中之前对其进行处理,我建议您进行简单的列表理解。

将文件中的行读入列表的简洁 Python 方式


首先,最重要的是,您应该专注于以高效且 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ã.