除了@unutbu 找到的链接(使用genfromtxt 中的解码/编码),这里是一个直接文件阅读器的速写:
示例文件 (utf8)
é, Ä
é, Ä
é, Ä
readlines, split, and pass through np.array:
In [327]: fn='uni_csv.txt'
In [328]: with open(fn) as f:lines=f.readlines()
In [329]: lines
Out[329]: ['é, Ä\n', 'é, Ä\n', 'é, Ä\n']
...
In [331]: [l.strip().split(',') for l in lines]
Out[331]: [['é', ' Ä'], ['é', ' Ä'], ['é', ' Ä']]
In [332]: np.array([l.strip().split(',') for l in lines])
Out[332]:
array([['é', ' Ä'],
['é', ' Ä'],
['é', ' Ä']],
dtype='<U2')
我不认为tab 分隔存在问题(除了我的文本编辑器设置为用空格替换制表符)。
对于混合数据类型,我需要添加一个tuple 转换(结构化数组定义需要一个元组列表):
In [343]: with open(fn) as f:lines=f.readlines()
In [344]: dt=np.dtype([('int',int),('é','|U2'),('Ä','U5')])
In [345]: np.array([tuple(l.strip().split(',')) for l in lines], dt)
Out[345]:
array([(1, ' é', ' Ä'), (2, ' é', ' Ä'), (3, ' é', ' Ä')],
dtype=[('int', '<i4'), ('é', '<U2'), ('Ä', '<U5')])
(我在文本文件中添加了一个整数列)
实际上loadtxt 也不会阻塞这个文件和dtype;它只是加载错误的字符串。
In [349]: np.loadtxt('uni_csv.txt',dtype=dt, delimiter=',')
Out[349]:
array([(1, "b'", "b' \\x"), (2, "b'", "b' \\x"), (3, "b'", "b' \\x")],
dtype=[('int', '<i4'), ('é', '<U2'), ('Ä', '<U5')])