我的文件如下:
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
如何解决?我也愿意接受全新(更好)的想法。
答案 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]])