如何在Python中将文件读入列表?
我想让用户输入要生成的随机数字的数量,并把这些数字保存到一个文件里。用户已经完成了这部分工作。接下来我们需要做的是打开这个文件,把里面的数字转换成一个列表,然后计算平均值、标准差等等,但不能使用Python里那些简单的内置工具。
我试着用 open
来打开文件,但它给我提示语法错误(我选择的文件名是“numbers”,它自动保存在 "My Documents"
里,所以我试过 open(numbers, 'r')
和 open(C:\name\MyDocuments\numbers, 'r')
,但都不行)。
8 个回答
f = open("file.txt")
lines = f.readlines()
你可以查看这里。readlines()
这个方法会返回一个列表,每一行都是一个元素。注意,这些行的末尾会有一个\n
(换行符)。你可以用strip()
这个方法去掉这个换行符。也就是说,你可以通过调用lines[index].strip()
来获取没有换行符的字符串。
正如joaquin提到的,别忘了用f.close()
来关闭文件。
把字符串转换成整数很简单:int("12")
。
在Python中,有两种方法可以把文件读入列表(这两种方法可以一起使用) -
- 使用
with
语句 - 从Python 2.5及以上版本支持 - 使用列表推导式
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中,可能会有一些延迟。
with open('C:/path/numbers.txt') as f:
lines = f.read().splitlines()
这段代码会给你一个值的列表(字符串),而且会去掉换行符。
另外,注意在Windows的路径名称中使用反斜杠,因为反斜杠在字符串中也有特殊含义。你可以用正斜杠或者两个反斜杠来代替。