我有一个csv文件,其中包含:
0812,EP2463,R,FEIGE
0812,EP2466,R,FEIGE
0816,EP2462,R,FEIGE
0816,EP2460,R,FEIGE
我需要将其转换为2D字符串数组。当我尝试
data = np.genfromtxt("data.csv", delimiter=',', dtype=None)
我得到一维数组
[['\xef\xbb\xbf0812' 'EP2463 'R' 'FEIGE']
['0812' 'EP2466' 'R' 'FEIGE']
['0816' 'EP2462' 'R' 'FEIGE']
['0816' 'EP2460' 'R' 'FEIGE']]
有更好的方法吗?
答案 0 :(得分:1)
您可以使用pandas
,它具有更多内置功能:
import numpy as np
from io import StringIO
mystr = StringIO("""0812,EP2463,R,FEIGE
0812,EP2466,R,FEIGE
0816,EP2462,R,FEIGE
0816,EP2460,R,FEIGE""")
# replace mystr with 'data.csv'
res = pd.read_csv(mystr, header=None, dtype=object).values.astype(str)
结果:
array([['0812', 'EP2463', 'R', 'FEIGE'],
['0812', 'EP2466', 'R', 'FEIGE'],
['0816', 'EP2462', 'R', 'FEIGE'],
['0816', 'EP2460', 'R', 'FEIGE']],
dtype='<U6')
答案 1 :(得分:1)
在使用numpy 1.14的PY3(ipython)会话中,以及使用BOM(在Linux中)写为UTF8的文件:
In [166]: np.genfromtxt('stack49969840.txt', delimiter=',', dtype=None,encoding='utf8')
Out[166]:
array([['\ufeff0812', 'EP2463', 'R', 'FEIGE'],
['0812', 'EP2466', 'R', 'FEIGE'],
['0816', 'EP2462', 'R', 'FEIGE'],
['0816', 'EP2460', 'R', 'FEIGE']], dtype='<U6')
In [167]: np.genfromtxt('stack49969840.txt', delimiter=',', dtype=None,encoding='utf-8-sig')
Out[167]:
array([(812, 'EP2463', 'R', 'FEIGE'), (812, 'EP2466', 'R', 'FEIGE'),
(816, 'EP2462', 'R', 'FEIGE'), (816, 'EP2460', 'R', 'FEIGE')],
dtype=[('f0', '<i8'), ('f1', '<U6'), ('f2', '<U1'), ('f3', '<U5')])
使用dtype=None
并忽略BOM,此数组为1d,带有结构化(复合)dtype。也就是说,它推断第一列可以作为整数读取。
以字符串形式加载,给出一个2d字符串dtype(这里是unicode,但它可能是bytestring):
In [169]: np.genfromtxt('stack49969840.txt', delimiter=',', dtype=str,encoding='utf-8-sig')
Out[169]:
array([['0812', 'EP2463', 'R', 'FEIGE'],
['0812', 'EP2466', 'R', 'FEIGE'],
['0816', 'EP2462', 'R', 'FEIGE'],
['0816', 'EP2460', 'R', 'FEIGE']], dtype='<U6')
以二进制模式读取的同一文件是:
In [8]: open('stack49969840.txt',mode='rb').read()
Out[8]: b'\xef\xbb\xbf0812,EP2463,R,FEIGE\n0812,EP2466,R,FEIGE\n0816,EP2462,R,FEIGE\n0816,EP2460,R,FEIGE\n'
加上你的额外字符串:
您的额外字符串是
In [168]: print('\xef\xbb\xbf')