我想提示用户生成一些随机数并保存到文件中。他给了我们这一部分。我们要做的部分是打开该文件,将数字转换为列表,然后找到平均值,标准偏差等,而不使用简单的内置Python工具。
我已尝试使用open
,但它为我提供了无效的语法(我选择的文件名为“数字”,并自动保存到"My Documents"
,因此我尝试了open(numbers, 'r')
和{ {1}}并且没有人工作过。)
答案 0 :(得分:210)
with open('C:/path/numbers.txt') as f:
lines = f.read().splitlines()
这将为您提供文件中的值(字符串)列表,并删除换行符。
另外,在Windows路径名中查看反斜杠,因为它们也是字符串中的转义字符。您可以使用正斜杠或双反斜杠。
答案 1 :(得分:96)
在python中将文件读入列表的两种方法(注意这些不是或者) -
with
- 支持python 2.5及以上版本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
结束时,文件将自动关闭。即使在其中引发异常,也是如此。
这可能被认为是低效的,因为文件描述符可能不会立即关闭。当在一个打开数千个文件的函数内调用它时可能是一个潜在的问题。
data = [line.strip() for line in open("C:/name/MyDocuments/numbers", 'r')]
请注意,文件关闭取决于实现。通常未使用的变量是由python解释器收集的垃圾。在cPython(python.org的常规解释器版本)中,它会立即发生,因为它的垃圾收集器通过引用计数工作。在另一个解释器中,如Jython或Iron Python,可能会有延迟。
答案 2 :(得分:52)
f = open("file.txt")
lines = f.readlines()
查看here。 readlines()
返回一个包含每个元素一行的列表。请注意,这些行在行尾包含\n
(换行符)。您可以使用strip()
- 方法剥离此换行符。即调用lines[index].strip()
以获取没有换行符的字符串。
正如joaquin所说,不要忘记f.close()
文件。
将strint转换为整数很简单:int("12")
。
答案 3 :(得分:14)
读取文件并将每行放入列表的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]
答案 4 :(得分:8)
您需要将文件名字符串传递给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 :(得分:5)
hdl = open("C:/name/MyDocuments/numbers", 'r')
milist = hdl.readlines()
hdl.close()
答案 6 :(得分:4)
总结一下人们所说的话:
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代码可能是您应该使用的代码
答案 7 :(得分:0)
如果每行有多个数字且有多行,则可以这样读取:
#!/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()]