2016-09-07 110 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 –