【问题标题】:np.genfromtxt multiple delimiters?np.genfromtxt 多个分隔符?
【发布时间】:2017-11-29 03:25:24
【问题描述】:

我的文件如下所示:

1497484825;34425;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14
1497484837;34476;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14

我想使用 np.genfromtxt 将它导入到 numpy 数组中。最大的问题是它有';'和 ',' 作为分隔符。 我的尝试:

import numpy as np
import io

s = io.StringIO(open('2e70dfa1.csv').read().replace(';',','))

data = np.genfromtxt(s,dtype=int,delimiter=',')

我得到错误:

TypeError: 无法将 'bytes' 对象隐式转换为 str

如何解决?我也乐于接受全新(更好)的想法。

【问题讨论】:

    标签: python arrays numpy typeerror genfromtxt


    【解决方案1】:

    根据docs

    参数
    fname : file, str, pathlib.Path, list of str, generator 要读取的文件、文件名、列表或生成器。如果文件扩展名 是gz或bz2,文件先解压。请注意,生成器 必须在 Python 3k 中返回字节字符串。列表中的字符串或 由生成器生成的被视为行。

    给它一个生成器可能更容易和更有效,只是记住它必须产生字节字符串:

    >>> with open('2e70dfa1.csv', 'rb') as f:
    ...     clean_lines = (line.replace(b';',b',') for line in f)
    ...     data = np.genfromtxt(clean_lines, dtype=int, delimiter=',')
    ...
    >>> data
    array([[1497484825,      34425,         -4,         28,        -14,
                    -4,         28,        -14,         -4,         28,
                   -14,         -4,         28,        -14,         -4,
                    28,        -14,         -4,         28,        -14],
           [1497484837,      34476,         -4,         28,        -14,
                    -4,         28,        -14,         -4,         28,
                   -14,         -4,         28,        -14,         -4,
                    28,        -14,         -4,         28,        -14]])
    

    【讨论】:

      【解决方案2】:

      Per the docs 用于 numpy.genfromtxt:

      请注意,生成器必须在 Python 3k 中返回字节字符串。

      因此,与其创建StringIO 对象,不如创建BytesIO

      import numpy as np 
      import io
      
      s = io.BytesIO(open('2e70dfa1.csv', 'rb').read().replace(b';',b','))
      data = np.genfromtxt(s,dtype=int,delimiter=',')
      

      产量

      array([[1497484825,      34425,         -4,         28,        -14,
                      -4,         28,        -14,         -4,         28,
                     -14,         -4,         28,        -14,         -4,
                      28,        -14,         -4,         28,        -14],
             [1497484837,      34476,         -4,         28,        -14,
                      -4,         28,        -14,         -4,         28,
                     -14,         -4,         28,        -14,         -4,
                      28,        -14,         -4,         28,        -14]])
      

      请注意,如果您安装了Pandas,则可以使用pd.read_table,它允许您指定正则表达式模式作为分隔符:

      import pandas as pd     
      df = pd.read_table('2e70dfa1.csv', sep=';|,', engine='python', header=None)
      print(df)
      

      产量

                 0      1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
      0  1497484825  34425  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14
      1  1497484837  34476  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14
      

      pd.read_table 返回一个数据帧。如果你需要一个 NumPy 数组,你可以通过它的values 属性来访问它:

      In [24]: df.values
      Out[24]: 
      array([[1497484825,      34425,         -4,         28,        -14,
                      -4,         28,        -14,         -4,         28,
                     -14,         -4,         28,        -14,         -4,
                      28,        -14,         -4,         28,        -14],
             [1497484837,      34476,         -4,         28,        -14,
                      -4,         28,        -14,         -4,         28,
                     -14,         -4,         28,        -14,         -4,
                      28,        -14,         -4,         28,        -14]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多