np.genfromtxt多个分隔符?

时间:2017-06-26 09:58:24

标签: python arrays numpy typeerror genfromtxt

我的文件如下:

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数组。最大的问题是它有&#39 ;;'和','作为分隔符。 我的尝试:

import numpy as np
import io

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

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

我收到错误:

  

TypeError:无法转换'字节'隐含地反对str

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

2 个答案:

答案 0 :(得分:4)

根据docs

  

<强>参数
   fname :file,str,pathlib.Path,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]])

答案 1 :(得分: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返回一个DataFrame。如果您需要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]])