我在读取包含混合字符串和浮点数的数据文件时遇到麻烦。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')