如何将文件读入 Python 中的列表? [复制]

Posted

技术标签:

【中文标题】如何将文件读入 Python 中的列表? [复制]【英文标题】:How do you read a file into a list in Python? [duplicate] 【发布时间】:2011-04-24 22:43:59 【问题描述】:

我想提示用户生成一些随机数并将其保存到文件中。他给了我们那部分。我们要做的部分是打开那个文件,将数字转换成一个列表,然后在不使用简单的内置 Python 工具的情况下找到平均值、标准差等。

我试过使用open,但它给了我无效的语法(我选择的文件名是“数字”,它自动保存到"My Documents",所以我尝试了open(numbers, 'r')open(C:\name\MyDocuments\numbers, 'r'),但都没有工作)。

【问题讨论】:

open(numbers, 'r') 可能应该给出NameError,除非您在之前的某个地方定义了numbers。就像 Python 一样简单,您可以从那里开始努力,我至少会尝试参考一些文本,为您提供更有条理的答案和示例。 @leoluk — 回滚您的更改,因为看起来这是 OP 问题的症结所在。 lines = list(file) 【参考方案1】:

在python中将文件读入列表的两种方法(注意这些不是或)-

    使用with - python 2.5 及更高版本支持 使用列表推导

1。使用with

这是打开和读取文件的pythonic方式。

#Sample 1 - elucidating each step but not memory efficient
lines = []
with open("C:\name\MyDocuments\numbers") as file:
    for line in file: 
        line = line.strip() #or some other preprocessing
        lines.append(line) #storing everything in memory!

#Sample 2 - a more pythonic and idiomatic way but still not memory efficient
with open("C:\name\MyDocuments\numbers") as file:
    lines = [line.strip() for line in file]

#Sample 3 - a more pythonic way with efficient memory usage. Proper usage of with and file iterators. 
with open("C:\name\MyDocuments\numbers") as file:
    for line in file:
        line = line.strip() #preprocess line
        doSomethingWithThisLine(line) #take action on line instead of storing in a list. more memory efficient at the cost of execution speed.

.strip() 用于文件的每一行以删除每行可能具有的 \n 换行符。当with 结束时,文件将自动为您关闭。即使在其中引发异常也是如此。

2。列表理解的使用

这可能被认为是低效的,因为文件描述符可能不会立即关闭。当在打开数千个文件的函数中调用它时,这可能是一个潜在的问题。

data = [line.strip() for line in open("C:/name/MyDocuments/numbers", 'r')]

请注意,文件关闭取决于实现。通常未使用的变量是由 python 解释器收集的垃圾。在 cPython(来自 python.org 的常规解释器版本)中,它会立即发生,因为它的垃圾收集器通过引用计数工作。在另一个解释器中,如 Jython 或 Iron Python,可能会有延迟。

【讨论】:

这不会关闭打开的文件。 我不知道 for 循环是最 Pythonic 的方式来做到这一点。我刚刚实施的解决方案是两者的混合。 (@sha 注意到它不会关闭文件。) 方法 1 不是很 Pythonic。您可以使用列表推导,而不是先创建空列表并附加到您自己的循环中。但是您不必像方法 2 中那样将所有内容(如文件 i/o)直接包含在您的理解中。相反......在“with”语句中结合列表理解似乎是最惯用的方法。即:with open('foo') as f: lines = [line.strip() for line in f] @CoreyGoldberg 我同意。我展示了样本 3 比收集列表中的所有数据更节省内存。偏离了所要求的内容,但我提到它是因为样本 1 和 2 的内存效率不高。 @CoreyGoldberg 请阅读我上面的评论。我知道这不是那个人问的。但作为经验丰富的程序员,我们有责任在适用的情况下展示有效的方法。我觉得我在样本 3 中呈现的内容并非无关紧要!这是一种动态处理数据的内存有效方式,而不是将整个内容存储在列表中然后处理它......因此我在回答他的实际问题后最后提出这个。【参考方案2】:

如果每行有多个数字并且有多行,则可以这样读取它们:

    #!/usr/bin/env python

    from os.path import dirname

    with open(dirname(__file__) + '/data/path/filename.txt') as input_data:
        input_list= [map(int,num.split()) for num in input_data.readlines()]

【讨论】:

使用dirname 有助于导航相对路径【参考方案3】:

从人们所说的总结一下:

f=open('data.txt', 'w') # will make a new file or erase a file of that name if it is present
f=open('data.txt', 'r') # will open a file as read-only
f=open('data.txt', 'a') # will open a file for appending (appended data goes to the end of the file)

如果你希望有一些类似于 try/catch 的东西

with open('data.txt') as f:
    for line in f:
        print line

我认为@movieyoda 代码可能是您应该使用的代码

【讨论】:

此“摘要”没有提供任何新内容,并且提供了与问题无关的信息。 (此外,该示例与 try/catch 无关......我完全不知道为什么会提到) @CoreyGoldberg 摘要通常不提供新信息,它们只是简单地总结;P。但是当使用open 时,我的答案的“新”信息大约是wa 选项。 OP 的问题是打开一个他/她想用 python 处理的文件。上下文管理器处理文件的关闭,如果没有上下文管理器,您将需要一种方法来确保文件被关闭,可能是finally: f.close()。 (相关***.com/a/8775008/465270)【参考方案4】:

您需要将文件名字符串传递给open。当字符串中包含 \ 时,还有一个额外的复杂性,因为这是 Python 的特殊字符串转义字符。您可以通过将每个加倍为\\ 或在字符串前面放置r 来解决此问题,如下所示:r'C:\name\MyDocuments\numbers'

编辑:对问题的编辑使其与原版完全不同,并且由于它们都不是来自原始海报,我不确定它们是否得到保证。然而,它确实指出了一件可能被忽视的显而易见的事情,那就是如何将“我的文档”添加到文件名中。

在英文版的 Windows XP 中,My Documents 实际上是 C:\Documents and Settings\name\My Documents。这意味着open 调用应如下所示:

open(r"C:\Documents and Settings\name\My Documents\numbers", 'r')

我认为您使用 XP 是因为您将其称为 My Documents - 它在 Vista 和 Windows 7 中发生了变化。我不知道是否有一种简单的方法可以在 Python 中自动查找它。

【讨论】:

【参考方案5】:

读取文件并将每一行放入列表的pythonic方法:

from __future__ import with_statement #for python 2.5
with open('C:/path/numbers.txt', 'r') as f:
    lines = f.readlines()

那么,假设每一行都包含一个数字,

numbers =[int(e.strip()) for e in lines]

【讨论】:

+1 表示 with 语句的使用;尽管他的学校必须真的落后于时代才能让他不得不使用__future__ 导入。【参考方案6】:
with open('C:/path/numbers.txt') as f:
    lines = f.read().splitlines()

这将为您提供文件中的值(字符串)列表,并去除换行符。

另外,请注意 Windows 路径名中的反斜杠,因为它们也是字符串中的转义字符。您可以改用正斜杠或双反斜杠。

【讨论】:

AttributeError: 'list' 对象没有属性 'splitlines' @TheOne,你从哪里得到的? f.read() 提供内容...不是列表。【参考方案7】:
hdl = open("C:/name/MyDocuments/numbers", 'r')
milist = hdl.readlines()
hdl.close()

【讨论】:

这会在每个元素的末尾留下一个换行符 这个答案是其他答案的副本,并且是在 3 年多之后给出的......没有新的添加【参考方案8】:
f = open("file.txt")
lines = f.readlines()

查看here。 readlines() 返回一个列表,每个元素包含一行。请注意,这些行在行尾包含\n(换行符)。您可以使用strip()-方法去掉这个换行符。 IE。调用lines[index].strip() 以获取不带换行符的字符串。

正如 joaquin 所说,不要忘记f.close() 该文件。

将 strint 转换为整数很简单:int("12")

【讨论】:

请注意strip() 会从字符串的开头和结尾删除所有空格 - 如果您需要空格,则可以改用lines[index][:-1](但请确保最后一行在结束!)。 file = open('C:\Data\TempPlayer.txt','r') lines = list(file) for line in lines:

以上是关于如何将文件读入 Python 中的列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在python中,我应该如何使用函数将文件读入二维列表后,不要让二维列表为空

Python将整数从csv文件读入列表

如何将 csv 文件读入 SWI prolog 中的列表列表,其中内部列表代表 CSV 的每一行?

如何从 JSON 文件读入 JavaScript? [复制]

将文件中的字符读入列表

如何把MATLAB中的数据读入到SIMULINK中