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

时间:2010-10-13 15:59:12

标签: python file

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

我已尝试使用open,但它为我提供了无效的语法(我选择的文件名为“数字”,并自动保存到"My Documents",因此我尝试了open(numbers, 'r')和{ {1}}并且没有人工作过。)

8 个答案:

答案 0 :(得分:210)

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

这将为您提供文件中的值(字符串)列表,并删除换行符。

另外,在Windows路径名中查看反斜杠,因为它们也是字符串中的转义字符。您可以使用正斜杠或双反斜杠。

答案 1 :(得分:96)

在python中将文件读入列表的两种方法(注意这些不是或者) -

  1. 使用with - 支持python 2.5及以上版本
  2. 使用列表推导
  3. 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,可能会有延迟。

答案 2 :(得分:52)

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

查看herereadlines()返回一个包含每个元素一行的列表。请注意,这些行在行尾包含\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()]