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

我想提示用户input一些随机数字并保存到一个文件中。 他给了我们那个部分。 我们要做的部分是打开该文件,将数字转换为列表,然后find平均值,标准偏差等,而不使用python工具中的简单内build。

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

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

这会给你一个你的文件中的值(string)列表,剥去换行符。

另外,请在windowspath名称中注意反斜杠,因为这些也是string中的逃逸字符。 您可以使用正斜杠或双反斜杠。

两种方法来读取文件到Python中的列表(注意这些都不是或) –

  1. 使用with – 由python 2.5及以上版本支持
  2. 使用列表parsing

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每行可能具有的换行符。 当结束时,文件将自动closures。 即使在它内部引发exception也是如此。

2.使用列表理解

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

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

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

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

看看这里 。 readlines()返回一个包含每个元素一行的列表。 请注意,这些行在行尾包含\n (换行符)。 你可以使用strip()方法去掉这个换行符。 即呼叫lines[index].strip()为了获得没有换行符的string。

正如joaquin指出的,不要忘记f.close()文件。

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

阅读文件并把每一行放在列表中的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] 

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

编辑:对这个问题的编辑使它与原来的完全不同,因为没有一个是从原来的海报,我不知道他们是warrented。 但是,它确实指出了一个可能被忽略的明显事情,那就是如何将“我的文档”添加到文件名中。

在英文版本的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中自动查找。

 hdl = open("C:/name/MyDocuments/numbers", 'r') milist = hdl.readlines() hdl.close() 

总结一下,人们一直在说些什么:

 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代码可能是你应该使用的

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

  #!/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()]