如何将文件读入 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
时,我的答案的“新”信息大约是w
和a
选项。 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中,我应该如何使用函数将文件读入二维列表后,不要让二维列表为空
如何将 csv 文件读入 SWI prolog 中的列表列表,其中内部列表代表 CSV 的每一行?