导入 csv 嵌入特殊字符与 numpy genfromtxt



>我有一个包含特殊字符的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 问题中帮助完成了这项任务。

相关内容

  • 没有找到相关文章

最新更新