如何在Python中将文件读入列表?

200 投票
8 回答
806088 浏览
提问于 2025-04-16 05:25

我想让用户输入要生成的随机数字的数量,并把这些数字保存到一个文件里。用户已经完成了这部分工作。接下来我们需要做的是打开这个文件,把里面的数字转换成一个列表,然后计算平均值、标准差等等,但不能使用Python里那些简单的内置工具。

我试着用 open 来打开文件,但它给我提示语法错误(我选择的文件名是“numbers”,它自动保存在 "My Documents" 里,所以我试过 open(numbers, 'r')open(C:\name\MyDocuments\numbers, 'r'),但都不行)。

8 个回答

72
f = open("file.txt")
lines = f.readlines()

你可以查看这里readlines()这个方法会返回一个列表,每一行都是一个元素。注意,这些行的末尾会有一个\n(换行符)。你可以用strip()这个方法去掉这个换行符。也就是说,你可以通过调用lines[index].strip()来获取没有换行符的字符串。

正如joaquin提到的,别忘了用f.close()来关闭文件。

把字符串转换成整数很简单:int("12")

133

在Python中,有两种方法可以把文件读入列表(这两种方法可以一起使用) -

  1. 使用 with 语句 - 从Python 2.5及以上版本支持
  2. 使用列表推导式

1. 使用 with 语句

这是在Python中打开和读取文件的推荐方式。

#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中,可能会有一些延迟。

346
with open('C:/path/numbers.txt') as f:
    lines = f.read().splitlines()

这段代码会给你一个值的列表(字符串),而且会去掉换行符。

另外,注意在Windows的路径名称中使用反斜杠,因为反斜杠在字符串中也有特殊含义。你可以用正斜杠或者两个反斜杠来代替。

撰写回答