>我有一个包含特殊字符的CSV。有些单元格是算术运算(如"(10/2("(。我想使用 np.genfromtxt 将这些单元格作为字符串导入到 numpy 中。我注意到的是它实际上以 UTF8 导入它们(如果我理解的话(。例如,每次我有一个除法符号时,我都会在 numpy 数组中得到这段代码:\xc3\xb7
如何将这些算术运算作为可读字符串导入?
谢谢!
看起来该文件可能有"其他"除法符号,即我们在小学学到的那个:
In [185]: b'xc3xb7'
Out[185]: b'xc3xb7'
In [186]: _.decode()
Out[186]: '÷'
最近的 numpy 版本可以更好地处理编码。 早期的尝试完全在字节串模式下工作(对于 Py3(以与 Py2 兼容。 但现在它需要一个encoding
参数。
In [68]: txt = '''(10/2), 1, 2
...: (10/2), 3,4'''
In [70]: np.genfromtxt(txt.splitlines(), dtype=None, delimiter=',')
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.
#!/usr/bin/python3
Out[70]:
array([(b'(10/2)', 1, 2), (b'(10/2)', 3, 4)],
dtype=[('f0', 'S6'), ('f1', '<i8'), ('f2', '<i8')])
In [71]: np.genfromtxt(txt.splitlines(), dtype=None, delimiter=',',encoding=None
...: )
Out[71]:
array([('(10/2)', 1, 2), ('(10/2)', 3, 4)],
dtype=[('f0', '<U6'), ('f1', '<i8'), ('f2', '<i8')])
诚然,这种从字符串列表模拟加载与从文件加载不同。 我没有安装早期的numpys(而不是在Py2上(,所以无法显示以前发生的事情。 但我的直觉是"(10/2("以前不应该出现问题,至少在 ASCII 文件中不应该。 字符串中没有任何特殊字符。
与另一个划分:
In [192]: txt = '''(10÷2), 1, 2
...: (10÷2), 3,4'''
In [194]: np.genfromtxt(txt.splitlines(), dtype=None, delimiter=',',encoding='ut
...: f8')
Out[194]:
array([('(10÷2)', 1, 2), ('(10÷2)', 3, 4)],
dtype=[('f0', '<U6'), ('f1', '<i8'), ('f2', '<i8')])
文件中的相同内容:
In [200]: np.genfromtxt('stack49859957.txt', dtype=None, delimiter=',')
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.
#!/usr/bin/python3
Out[200]:
array([(b'(10xf72)', 1, 2), (b'(10xf72)', 3, 4)],
dtype=[('f0', 'S6'), ('f1', '<i8'), ('f2', '<i8')])
In [199]: np.genfromtxt('stack49859957.txt', dtype=None, delimiter=',',encoding=
...: 'utf8')
Out[199]:
array([('(10÷2)', 1, 2), ('(10÷2)', 3, 4)],
dtype=[('f0', '<U6'), ('f1', '<i8'), ('f2', '<i8')])
在早期版本中,encoding
可以在converter
中实现。 我在以前的 SO 问题中帮助完成了这项任务。