2016-09-07 176 views
1

我无法读取数据文件包含混合字符串,并与numpy.loadtxt漂浮在Python 3 Python 2中工作正常,但我希望我的代码在PY3工作。numpy.loadtxt返回字符串再版字节字符串,而不是字符串

简化示例:

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给出了包含字节串的字符串表示形式的字符串。

我怎样才能摆脱这个烂摊子在Python3普通字符串?

回答

1

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') 
+0

Thanks!我将提交一份针对Numpy的错误报告。 –

+0

错误报告:https://github.com/numpy/numpy/issues/8033 –