我在使用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中从这个混乱中获取纯字符串?
答案 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')