解析 Python 中的非 ASCII 字符 3

Parsing non-ASCII characters in Python 3

我正在尝试从包含 é、Ä 等字符的文件中读取。我正在使用 numpy.loadtxt() 但我收到 UnicodeDecodeErrors,因为解码器无法解析它们。我的首要任务是尽可能保留这些字符,但如果不能,我不介意求助于替换它们。有什么建议吗?

除了@unutbu发现的link(在genfromtxt中使用decode/encode),这里有一个直接文件reader的快速草图:

示例文件 (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 也不会阻塞此文件和数据类型;它只是加载了错误的字符串。

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')])