如何在python中将文件读取到列表中?

How do you read a file into a list in Python?

本问题已经有最佳答案,请猛点这里访问。

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

我试过使用open,但它给了我无效的语法(我选择的文件名是"数字",它自动保存到"My Documents"中,所以我尝试了open(numbers, 'r')open(C:
ame\MyDocuments
umbers, 'r')
,但没有一个成功)。


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

这将给您一个文件中的值(字符串)列表,去除换行符。

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


在python中将文件读取到列表中的两种方法(注意,这两种方法都不是或-

  • 使用由python 2.5及更高版本支持的with
  • 清单理解的使用
  • 1。使用with

    这是打开和读取文件的方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #Sample 1 - elucidating each step but not memory efficient
    lines = []
    with open("C:
    ame\MyDocuments
    umbers"
    ) 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:
    ame\MyDocuments
    umbers"
    ) 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:
    ame\MyDocuments
    umbers"
    ) 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()来删除每行可能具有的
    换行符。当with结束时,文件将自动为您关闭。即使在其内部引发异常,也是如此。

    2。列表理解的使用

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

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

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


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

    看看这里。readlines()返回一个列表,每个元素包含一行。注意,这些行在行的末尾包含EDOCX1(换行符)。您可以使用strip()方法去掉这个换行符。也就是说,调用lines[index].strip()以获得不带换行符的字符串。

    如Joaquin所说,不要忘记f.close()的文件。

    将strint转换为整数很容易:int("12")


    阅读文件并将每一行放在列表中的方法:

    1
    2
    3
    from __future__ import with_statement #for python 2.5
    with open('C:/path/numbers.txt', 'r') as f:
        lines = f.readlines()

    然后,假设每行包含一个数字,

    1
    numbers =[int(e.strip()) for e in lines]


    您需要将文件名字符串传递给open。当字符串中包含\时,会有一个额外的复杂性,因为这是一个特殊的字符串转义字符,用于Python。您可以通过将每个都加倍为\\或将r放在字符串前面来修复此问题,如下所示:r'C:
    ame\MyDocuments
    umbers'

    编辑:对问题的编辑使它与原版完全不同,因为它们都不是来自原版海报,所以我不确定它们是否被版权保护。然而,它确实指出了一个可能被忽略的明显问题,那就是如何将"我的文档"添加到文件名中。

    在英文版的WindowsXP中,My Documents实际上是C:\Documents and Settings
    ame\My Documents
    。这意味着open调用应该如下所示:

    1
    2
    3
    open(r"C:\Documents and Settings
    ame\My Documents
    umbers"
    , 'r')

    我猜你使用XP是因为你称它为My Documents——它在Vista和Windows7中发生了变化。我不知道是否有一种简单的方法可以在python中自动查找它。


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


    总结一下人们所说的话:

    1
    2
    3
    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)

    如果您希望有类似于尝试/捕获的内容

    1
    2
    3
    with open('data.txt') as f:
        for line in f:
            print line

    我认为@movieyoda code可能是你应该使用的。


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

    1
    2
    3
    4
    5
    6
        #!/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()]