【问题标题】:Loading a file into a numpy array with python使用python将文件加载到numpy数组中
【发布时间】:2012-06-11 20:49:50
【问题描述】:

所以我对 Python 非常熟悉,并且正在尝试通过复制我编写的一些 matlab 代码来学习。我有一个部分,在 matlab 中,我加载了一个制表符分隔的数据文件。语法

x = load(data.txt)

获取制表符分隔的数据并将它们放入标记为 x 的矩阵的单元格中。

有没有办法在 python 中做到这一点,但使用逗号分隔的数据?

【问题讨论】:

    标签: python csv file-io numpy


    【解决方案1】:

    有多种方法,选择最适合您应用的一种。

    如果您正在使用numpy,最好使用numpy 的loadloadtxtfromfilegenfromtxt 函数,因为您的文件将被加载到合适的结构中,预处理后。

    但是,如果您不打算使用 numpy(或任何其他具有一些文件加载​​功能的 big 库),那么仅使用它来加载文件将是一种矫枉过正...考虑使用内置的 python 函数,或者标准库中的 csv module 来代替......它会更灵活,更流畅。

    以下是使用file.txt 的示例(每行的值用制表符分隔):

    1   2   3   4
    7   8   9   10  11  12
    13  14  15
    

    python 内置

    没有要导入的模块,非常简单,灵活,在大多数情况下都是不错的选择,恕我直言。

    仅使用内置函数以二进制模式加载文件以读取(rb 标志)表(值列表的列表,在文件中用制表符分隔):

    >>> file = open('file.txt', 'rb')
    >>> table = [row.strip().split('\t') for row in file]
    

    csv

    标准库中的csv module 也非常简单。

    请注意,尽管 CSV 表示逗号分隔值,但实际上没有标准,您可以选择任何您想要的分隔符。因此 CSV 代表所有面向单元格或类似表格的文件。

    以二进制模式加载文件以读取(rb 标志)在带有 csv reader 的表(值列表的列表,在文件中用制表符分隔)中:

    >>> import csv
    >>> file = open('file.txt', 'rb')
    >>> data = csv.reader(file, delimiter='\t')
    >>> table = [row for row in data]
    

    访问单元格

    表格已经和前面两个例子一样加载了,可以像table[row][col]一样访问表格的数据:

    >>> table
    [['1', '2', '3', '4'], ['7', '8', '9', '10', '11', '12'], ['13', '14', '15']]    
    >>> table[0]
    ['1', '2', '3', '4']
    >>> table[1][2]
    9
    

    【讨论】:

      【解决方案2】:

      numpy.loadtxt 函数将 ASCII 文件中的数据读取到 numpy 数组中。用于分隔值的字符串可以使用 delimiter 参数定义:

      numpy.loadtxt('data.txt', delimiter=',')
      

      对于更复杂的情况,numpy.genfromtxt 函数是一个很好的选择。

      【讨论】:

        【解决方案3】:

        查看csv 模块(特别是reader 类)和/或numpy.loadtxt 函数。

        【讨论】:

          【解决方案4】:

          如果您将 Python 用于类似 MATLAB 的目的,您将希望使用 NumPy(和 scipy);特别是,您应该阅读NumPy for MATLAB Users

          如果你有逗号分隔的数据,你可以使用numpy.loadtxt来读取它(当然是在安装numpy之后):

          $ cat matrix.csv 
          1,2,3
          4,5,6
          7,8,9
          

          然后

          >>> import numpy as np
          >>> m = np.loadtxt("matrix.csv", delimiter=",")
          >>> m
          array([[ 1.,  2.,  3.],
                 [ 4.,  5.,  6.],
                 [ 7.,  8.,  9.]])
          >>> np.matrix(m)
          matrix([[ 1.,  2.,  3.],
                  [ 4.,  5.,  6.],
                  [ 7.,  8.,  9.]])
          

          【讨论】:

            【解决方案5】:

            标准库中有一个csv模块。

            See the documentation here

            >>> import csv
            >>> spamReader = csv.reader(open('eggs.csv', 'rb'), delimiter=' ', quotechar='|')
            >>> for row in spamReader:
            ...     print ', '.join(row)
            Spam, Spam, Spam, Spam, Spam, Baked Beans
            Spam, Lovely Spam, Wonderful Spam
            

            【讨论】:

            • 只是一个注释,但我觉得应该明确指出源文件必须以二进制模式打开这一事实(而不是让某人认为二进制或文本模式都可以) ;如果不这样做,您可能会收到与换行相关的错误。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-21
            • 1970-01-01
            相关资源
            最近更新 更多