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

Jul*_*ick 2028 python string file readlines

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

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

Sil*_*ost 2057

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] 
Run Code Online (Sandbox Code Playgroud)

  • 不要在`for`循环中使用`file.readlines()`,文件对象本身就足够了:`lines = [line.rstrip('\n')for line in file]` (179认同)
  • 如果您使用`readlines()处理大数据,则效率不高,因为它可能导致**MemoryError**.在这种情况下,最好使用`for line in f:`并使用每个`line`变量迭代文件. (73认同)
  • 我使用[here](/sf/answers/3197530661/)提到的程序检查了答案中给出的不同方式的内存配置文件.根据@DevShark [here](/sf/answers/2493600721/)的建议,从文件中读取每一行并进行处理时,内存使用情况要好得多.如果内存是约束或文件很大,那么保持集合对象中的所有行都不是一个好主意.两种方法的执行时间都相似. (6认同)
  • 另外,如果你从行的末尾剥去空格,`.rstrip()`的工作速度会稍快一些. (6认同)
  • 我认为海象版本会停在空行上 (6认同)
  • Oneliner: `with open(filename) as f: content = [i.strip() for i in f.readlines()]` (3认同)
  • @蒂莫不是。请参阅文档:[`io.IOBase.readlines()`](https://docs.python.org/3/library/io.html#io.IOBase.readlines)。你认为为什么会这样? (3认同)
  • 我认为 `readlines()` 已被弃用。 (2认同)
  • @AlexisWilke:请参阅[“:=”语法和赋值表达式:什么和为什么?](/sf/ask/3520839311/) (2认同)

Fel*_*ing 925

请参阅输入和输出:

with open('filename') as f:
    lines = f.readlines()
Run Code Online (Sandbox Code Playgroud)

或者剥离换行符:

lines = [line.rstrip('\n') for line in open('filename')]
Run Code Online (Sandbox Code Playgroud)

编者注:这个答案的原始空白剥离命令,__CODE__正如Janus Troelsen的评论所暗示的那样,将删除所有前导和尾随空格,而不仅仅是尾随空格__CODE__.

  • 第二个选项不会让文件保持打开状态(因为它没有自己的上下文保护)吗? (29认同)
  • 更安全:`用open('filename')作为f:lines = [line.rstrip('\n')用于f中的行] (25认同)
  • @yo'确实如此,但大多数人并不关心小程序.小程序没有坏处,因为泄漏的文件对象是垃圾收集的,但这不是一个好习惯. (9认同)
  • 更好的是,使用`f.read().splitlines()`,它确实删除换行符 (5认同)
  • @AaronHall *“当对象不再有对其的引用时,它将被垃圾收集并关闭文件”* - 这对于 CPython 是正确的,但对于 PyPy 则不然。并非所有 Python 实现都会在不再引用对象时立即销毁对象。因此,即使在这种情况下,将“with”与“open”结合使用的最佳实践也是相关的。 (3认同)
  • 你可能还需要`line.rstrip('\n').rstrip('\ r')` (2认同)
  • 最好一次读取一行文件,而不是一次性将整个文件读入内存.对于大输入文件,这样做不能很好地扩展.罗伯特见下面的回答. (2认同)
  • `lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]` 如果我这样写,读完后如何关闭文件? (2认同)
  • 是的,就其他人在这里提出的观点而言,虽然在没有上下文管理器(或其他有保证的关闭它的方式)的情况下使用 `open` 不是“最佳实践”,但这并不是真正的情况之一 - 当对象有不再引用它,它将被垃圾收集并关闭文件,当列表理解完成处理时,无论是否出错,这都应该立即发生。 (2认同)

rob*_*ert 543

这比必要的更明确,但做你想要的.

with open("file.txt", "r") as ins:
    array = []
    for line in ins:
        array.append(line)
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案,因为它不需要将整个文件加载到内存中(在这种情况下,它仍然附加到`array`,但可能还有其他情况).当然,对于大文件,这种方法可以减轻问题. (12认同)
  • 该解决方案确实将整个文件加载到内存中。我不知道为什么人们认为不是。 (9认同)
  • **注意:** 此解决方案不会删除换行符。 (8认同)
  • 追加到数组很慢。我想不出这是最佳解决方案的用例。 (3认同)
  • @andrebrait它选择将整个文件加载到lines[]中,但只能逐行加载。 (2认同)

Noc*_*wer 263

这将从文件中生成一行"数组".

lines = tuple(open(filename, 'r'))
Run Code Online (Sandbox Code Playgroud)

  • @NoctisSkytower我发现`lines = open(filename).read().splitlines()`更清洁,我相信它也能更好地处理DOS行结尾. (28认同)
  • @MarshallFarrier尝试`lines = open(filename).read().split('\n')`代替. (24认同)
  • 它关闭文件? (15认同)
  • @ mklement0假设一个1000行的文件,`list`占用的空间比`tuple`多13.22%.结果来自`来自sys import getsizeof为g; i = [无]*1000; round((g(list(i))/ g(tuple(i)) - 1)*100,2)`.创建`tuple`比创建`list`(标准偏差为0.16%)需要大约4.17%的时间.结果来自于从timeit import timeit运行`t; round((t('tuple(i)','i = [None]*1000')/ t('list(i)','i = [None]*1000') - 1)*100,2) `30次.当对可变性的需求未知时,我的解决方案有利于空间超速. (8认同)
  • @Vanuan由于在运行该行之后没有对文件的剩余引用,析构函数_should_会自动关闭该文件. (4认同)
  • 这很优雅(除了在答案本身中值得注意的是尾随的`\n`保留在每个元素中),但我很好奇为什么你选择`tuple()`而不是`list()`.基于我的非正式测试,`list()`执行得稍微好一些(可能无关紧要).`list()`,与`tuple()`不同,将返回_mutable_序列(可能需要也可能不需要). (4认同)
  • @ dal102是的,我同意你的意见,并希望我早点了解`splitlines`方法.但是,请注意`open`函数的`newline`参数是'None`,因此启用了通用换行模式,并且在这种情况下拆分''\n'`是有效的.但有趣的是,有一个`bytes.splitlines`方法.这使得在二进制模式下打开文件时能够模拟通用换行模式.您实际上不需要在文本模式下打开文件以轻松地在行边界上拆分文件的数据,并且可以避免导入`re`模块. (3认同)

Ene*_*nso 188

如果你想要\n包括:

with open(fname) as f:
    content = f.readlines()
Run Code Online (Sandbox Code Playgroud)

如果你不想要\n包括:

with open(fname) as f:
    content = f.read().splitlines()
Run Code Online (Sandbox Code Playgroud)


Ped*_*ito 149

如果你不关心关闭文件,这个单线程工作:

with open('file.txt') as f:
    my_list = list(f)
Run Code Online (Sandbox Code Playgroud)

传统的方法:

with open('file.txt') as f:
    lines = f.readlines()
Run Code Online (Sandbox Code Playgroud)

使用listwith (推荐):

lines = open('file.txt').readlines()
Run Code Online (Sandbox Code Playgroud)

  • @oneturkmen 不,他是对的。他正在循环遍历文件中的行。如果该行位于“with”子句之后,那么您是正确的 (2认同)

Dev*_*ark 140

您可以简单地执行以下操作,如下所示:

with open('/your/path/file') as f:
    my_lines = f.readlines()
Run Code Online (Sandbox Code Playgroud)

请注意,此方法有两个缺点:

1)您将所有行存储在内存中.在一般情况下,这是一个非常糟糕的主意.该文件可能非常大,您可能会耗尽内存.即使它不大,也只是浪费内存.

2)当你阅读它们时,这不允许处理每一行.因此,如果您在此之后处理您的行,则效率不高(需要两次通过而不是一次).

对于一般情况,更好的方法如下:

with open('/your/path/file') as f:
    for line in f:
        process(line)
Run Code Online (Sandbox Code Playgroud)

您可以以任何方式定义过程函数.例如:

def process(line):
    if 'save the world' in line.lower():
         superman.save_the_world()
Run Code Online (Sandbox Code Playgroud)

(Superman课程的实施留给你练习).

这适用于任何文件大小,只需1遍即可浏览您的文件.这通常是通用解析器的工作方式.

  • 这正是我所需要的 - 并且感谢您解释其缺点.作为Python的初学者,理解为什么解决方案是解决方案真是太棒了.干杯! (5认同)
  • 想想更多Corey.你真的希望你的计算机读取每一行,而不用这些行吗?当然,你可以意识到你总是需要以某种方式处理它们. (5认同)
  • 你总是需要对这些线做些什么.它可以像打印线条或计算它们一样简单.让你的进程读取内存中的行,但没有用它做任何事情是没有价值的. (5认同)
  • 你总是需要对它们做点什么.我认为你要做的一点是,你可能希望立即将一个函数应用于所有这些函数,而不是一个接一个.有时确实如此.但是从内存的角度来看这样做是非常低效的,并且如果文件的占用空间大于你的Ram,则会阻止你阅读文件.这就是为什么通常的通用解析器以我描述的方式运行的原因. (2认同)
  • @PierreOcinom这是正确的.鉴于文件以只读模式打开,您无法使用上面的代码修改原始文件.要打开读写文件,请使用`open('file_path','r +')` (2认同)
  • 我使用 [here](/sf/answers/3197530661/) 提到的过程检查了两种方式的内存配置文件。正如@DevShark 所建议的那样,当从文件中读取每一行并进行处理时,内存使用情况要好得多。如果内存是一个约束或文件很大,则在集合对象中保存所有行**不是**一个好主意。两种方法的执行时间相似。 (2认同)

Gio*_* PY 60

数据到列表中

假设我们有一个包含我们数据的文本文件,如下所示:

文字文件内容:

line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud)
  • 在同一目录中打开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']
Run Code Online (Sandbox Code Playgroud)

使用追加

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

要么...

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

要么...

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

要么...

>>> 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)
Run Code Online (Sandbox Code Playgroud)

  • @EricOLebigot 从显示的示例来看,看起来 `read().splitlines()` 和 `readlines()` 不会产生相同的输出。你确定它们是等价的吗? (3认同)
  • 如果仅使用 readlines,则需要使用 strip 方法来删​​除文本中的 \n,因此我使用列表理解更改了最后一个示例,以便在两种情况下具有相同的输出。因此,如果您使用 read().readlines() ,您将拥有一个带有该行且没有换行符的“干净”项目,否则,您必须执行上面代码中看到的操作。 (2认同)

MSe*_*ert 42

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

  • 打开文件
  • 阅读文件
  • 将内容存储为列表

幸运的是,Python可以很容易地完成这些操作,因此将文件读入列表的最短方法是:

lst = list(open(filename))
Run Code Online (Sandbox Code Playgroud)

但是我会补充一些解释.

打开文件

我假设你想打开一个特定的文件而你不直接处理文件句柄(或类似文件的句柄).在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)
Run Code Online (Sandbox Code Playgroud)

请注意,需要指定文件扩展名.这对Windows用户尤为重要,因为在浏览器中查看时,默认情况下会隐藏类似.txt.doc等的文件扩展名.

第二个参数是mode,它r默认表示"只读".这正是您所需要的.

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

要读取文件,您可以省略mode或明确传递它:

open(filename)
open(filename, 'r')
Run Code Online (Sandbox Code Playgroud)

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

open(filename, 'rb')
Run Code Online (Sandbox Code Playgroud)

在其他平台上,'b'(二进制模式)被简单地忽略.


现在我已经展示了如何使用open该文件,让我们再谈谈你总是需要close它的事实.否则它将保持文件的打开文件句柄,直到进程退出(或Python使文件句柄变得无效).

虽然你可以使用:

f = open(filename)
# ... do stuff with f
f.close()
Run Code Online (Sandbox Code Playgroud)

当介于两者之间openclose抛出异常时,将无法关闭该文件.你可以通过使用try和来避免这种情况finally:

f = open(filename)
# nothing in between!
try:
    # do stuff with f
finally:
    f.close()
Run Code Online (Sandbox Code Playgroud)

但是Python提供上下文管理是有一个漂亮的语法(但open它几乎等同于tryfinally以上):

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

最后一种方法是在Python中打开文件的推荐方法!

读取文件

好的,你已经打开了文件,现在该如何阅读?

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

with open(filename) as f:
    for line in f:
        print(line)
Run Code Online (Sandbox Code Playgroud)

这将打印文件的每一行.但请注意,每一行最后都会包含换行符\n(您可能需要检查Python是否使用通用换行符支持构建- 否则您也可以\r\n在Windows或\rMac上作为换行符).如果你不想要,你可以简单地删除最后一个字符(或Windows上的最后两个字符):

with open(filename) as f:
    for line in f:
        print(line[:-1])
Run Code Online (Sandbox Code Playgroud)

但是最后一行不一定有一个尾随换行符,所以不应该使用它.可以检查它是否以尾随换行结束,如果是,则删除它:

with open(filename) as f:
    for line in f:
        if line.endswith('\n'):
            line = line[:-1]
        print(line)
Run Code Online (Sandbox Code Playgroud)

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

with open(filename) as f:
    for line in f:
        print(f.rstrip())
Run Code Online (Sandbox Code Playgroud)

但是,如果行结束\r\n(Windows"换行符"),.rstrip()也将照顾\r!

将内容存储为列表

既然您知道如何打开文件并阅读它,那么就可以将内容存储在列表中了.最简单的选择是使用该list功能:

with open(filename) as f:
    lst = list(f)
Run Code Online (Sandbox Code Playgroud)

如果您想要删除尾随换行符,则可以使用列表推导:

with open(filename) as f:
    lst = [line.rstrip() for line in f]
Run Code Online (Sandbox Code Playgroud)

甚至更简单:默认情况下.readlines(),file对象的方法返回list一行:

with open(filename) as f:
    lst = f.readlines()
Run Code Online (Sandbox Code Playgroud)

这也将包括尾部换行符,如果你不想要它们,我会推荐这种[line.rstrip() for line in f]方法,因为它避免保留两个包含内存中所有行的列表.

还有一个额外的选项来获得所需的输出,但它相当"次优":read字符串中的完整文件然后拆分换行:

with open(filename) as f:
    lst = f.read().split('\n')
Run Code Online (Sandbox Code Playgroud)

要么:

with open(filename) as f:
    lst = f.read().splitlines()
Run Code Online (Sandbox Code Playgroud)

这些会自动处理尾随换行符,因为split不包含该字符.但是它们并不理想,因为您将文件保存为字符串和内存中的行列表!

摘要

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


Joh*_*nny 41

将文件行读入列表的清洁和pythonic方式


首先,您应该专注于打开文件并以高效和pythonic的方式阅读其内容.以下是我个人不喜欢的方式示例:

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.
Run Code Online (Sandbox Code Playgroud)

相反,我更喜欢以下打开文件进行读取和写入的方法,因为它非常干净,并且一旦完成使用它就不需要额外的步骤来关闭文件.在下面的语句中,我们打开文件进行读取,并将其分配给变量'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.
Run Code Online (Sandbox Code Playgroud)

现在我们需要专注于将这些数据放入Python列表中,因为它们是可迭代的,高效的和灵活的.在您的情况下,期望的目标是将文本文件的每一行放入单独的元素中.为此,我们将使用splitlines()方法,如下所示:

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
Run Code Online (Sandbox Code Playgroud)

最终产品:

# 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()
Run Code Online (Sandbox Code Playgroud)

测试我们的代码:

  • 文本文件的内容:
     A fost odatã ca-n povesti,
     A fost ca niciodatã,
     Din rude mãri împãrãtesti,
     O prea frumoasã fatã.
Run Code Online (Sandbox Code Playgroud)
  • 用于测试目的的打印语句:
    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]
Run Code Online (Sandbox Code Playgroud)
  • 输出(由于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ã.
Run Code Online (Sandbox Code Playgroud)


小智 29

这是通过对文件使用列表推导的另一个选项;

lines = [line.rstrip() for line in open('file.txt')]
Run Code Online (Sandbox Code Playgroud)

这应该是更有效的方式,因为大部分工作是在Python解释器内完成的.

  • `rstrip()`可能会删除_all_尾随空格,而不仅仅是`\n`; 使用`.rstrip('\n')`. (9认同)
  • 这也不能保证在读取所有 Python 实现后文件将被关闭(尽管在主要 Python 实现 CPython 中,它会被关闭)。 (2认同)

ato*_*3ls 26

另一种选择是numpy.genfromtxt,例如:

import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")
Run Code Online (Sandbox Code Playgroud)

这将使dataNumPy数组具有与文件中一样多的行.


mol*_*ean 26

f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out
Run Code Online (Sandbox Code Playgroud)

现在变量输出是你想要的列表(数组).你可以这样做:

for line in out:
    print (line)
Run Code Online (Sandbox Code Playgroud)

要么

for line in f:
    print (line)
Run Code Online (Sandbox Code Playgroud)

你会得到相同的结果.


Mar*_*oma 26

使用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)
Run Code Online (Sandbox Code Playgroud)

需要注意的事项:

  • with是一个所谓的上下文管理器.它确保打开的文件再次关闭.
  • 这里的所有解决方案都会简单地制造.strip().rstrip()将无法再现,lines因为它们也剥离了白色空间.

常见文件结尾

.txt

更高级的文件写入/读取

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

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

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

如果您正在寻找一种制作配置文件的方法,您可能希望阅读我的简短文章Python中的配置文件.


oli*_*and 24

如果您想从命令行或stdin读取文件,还可以使用该fileinput模块:

# reader.py
import fileinput

content = []
for line in fileinput.input():
    content.append(line.strip())

fileinput.close()
Run Code Online (Sandbox Code Playgroud)

像这样传递文件:

$ python reader.py textfile.txt 
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多内容:http://docs.python.org/2/library/fileinput.html


Lan*_*are 23

在Python 3.4中引入,pathlib有一个非常方便的从文件中读取文本的方法,如下所示:

from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()
Run Code Online (Sandbox Code Playgroud)

(该splitlines调用将其从包含文件的全部内容的字符串转换为文件中的行列表).

pathlib有很多方便的便利.read_text很简洁,你不必担心打开和关闭文件.如果您只需要一次性读取文件,那么这是一个不错的选择.


Jea*_* T. 21

最简单的方法

一个简单的方法是:

  1. 将整个文件作为字符串读取
  2. 逐行拆分字符串

在一行中,这将给出:

lines = open('C:/path/file.txt').read().splitlines()
Run Code Online (Sandbox Code Playgroud)


Abd*_*lal 15

只需使用splitlines()函数.这是一个例子.

inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3
Run Code Online (Sandbox Code Playgroud)

在输出中,您将获得行列表.


pam*_*bda 12

如果你想要面对一个非常大/巨大的文件并希望更快阅读(想象你是在Topcoder/Hackerrank编码竞赛中),你可能会一次将更大的行读入内存缓冲区,而不是只是在文件级别逐行迭代.

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)
Run Code Online (Sandbox Code Playgroud)


sim*_*eco 9

实现此目标的最简单方法是:

lines = list(open('filename'))
Run Code Online (Sandbox Code Playgroud)

要么

lines = tuple(open('filename'))
Run Code Online (Sandbox Code Playgroud)

要么

lines = set(open('filename'))
Run Code Online (Sandbox Code Playgroud)

在使用的情况下set,必须记住,我们没有保留行顺序并摆脱了重复的行。

  • 由于您没有对文件对象调用“.close”,也没有使用“with”语句,因此在某些 Python 实现中,文件在读取后可能不会关闭,并且您的进程将泄漏打开的文件句柄。在 CPython(大多数人使用的普通 Python 实现)中,这不是问题,因为文件对象将立即被垃圾收集,这将关闭文件,但通常认为最好的做法是执行“with open”之类的操作('filename') as f:lines = list(f)` 以确保无论您使用哪种 Python 实现,文件都会关闭。 (3认同)

Zer*_*ero 5

用这个:

import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values
Run Code Online (Sandbox Code Playgroud)

data是数据框类型,并使用值获取ndarray。您还可以使用来获得列表array.tolist()


jea*_*i90 5

如果文档中也有空行,我喜欢读取内容并将其传递filter以防止空字符串元素

with open(myFile, "r") as f:
    excludeFileContent = list(filter(None, f.read().splitlines()))
Run Code Online (Sandbox Code Playgroud)

  • 这是非Pythonic的,要小心。 (2认同)