numpy.Loadtxt返回bytestring的字符串repr而不是string



我在读取包含混合字符串和浮点数的数据文件时遇到麻烦。Python 3中的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给出包含字节字符串的字符串表示的字符串。

我如何从Python3的混乱中获得普通字符串?

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

最新更新