numpy.loadtxt返回字符串的字符串repr而不是字符串

时间:2016-09-07 13:38:13

标签: python-3.x numpy

我在使用Python 3中的numpy.loadtxt读取包含混合字符串和浮点数的数据文件时遇到问题.Python 2工作正常,但我希望我的代码在Py3中工作。

简化示例:

import numpy as n

strings = ['str1', 'str2']
parsed = n.loadtxt(strings, dtype='str')
print('Result:', parsed)

,执行时,为Py2和Py3提供不同的结果。

$> python2 mwe.py 
Result: ['str1' 'str2']
$> python3 mwe.py 
Result: ["b'str1'" "b'str2'"]

Python 2按预期提供字符串,Python 3提供包含bytestrings字符串表示的字符串。

如何在Python3中从这个混乱中获取纯字符串?

1 个答案:

答案 0 :(得分:2)

loadtxt在解析之前已通过asbytes函数传递了您的输入字符串(它通常将文件读取为字节串)。但它如何将它们转换为unicode确实看起来很麻烦。

genfromtxt似乎可以更好地处理

In [241]: np.genfromtxt([b'str1', b'str2'], dtype='str')
Out[241]: 
array(['str1', 'str2'], 
      dtype='<U4')

但如果你不给它字节串,它会抱怨:

In [242]: np.genfromtxt(['str1', 'str2'], dtype='str')
TypeError: Can't convert 'bytes' object to str implicitly

加载为S4并转换为unicode后是另一种选择:

In [244]: np.genfromtxt([b'str1', b'str2'], dtype='S4').astype('str')
Out[244]: 
array(['str1', 'str2'], 
      dtype='<U4')
In [245]: np.loadtxt([b'str1', b'str2'], dtype='S4').astype('str')
Out[245]: 
array(['str1', 'str2'], 
      dtype='<U4')
In [246]: np.loadtxt(['str1', 'str2'], dtype='S4').astype('str')
Out[246]: 
array(['str1', 'str2'], 
      dtype='<U4')

另一种解决方法是使用converter

In [250]: np.loadtxt(['str1', 'str2'], dtype='str',converters={0:lambda x: x.decode()})
Out[250]: 
array(['str1', 'str2'], 
      dtype='<U4')