2016-09-07 12 views
1

Python 3でnumpy.loadtxtと混在した文字列と浮動小数点を含むデータファイルを読み込めません。Python 2は正常に動作しますが、Py3 。numpy.loadtxtは、文字列の代わりにbytestringの文字列reprを返します。

簡略化した例:実行、

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に渡しました(通常、ファイルをバイトストリングとして読み込みます)。しかし、どのようにそれらをユニコードに変換するのかは不便です。

genfromtxt

In [241]: np.genfromtxt([b'str1', b'str2'], dtype='str') 
Out[241]: 
array(['str1', 'str2'], 
     dtype='<U4') 

これより良いを処理するように見える。しかし、あなたはそれがバイト文字列与えていない場合、それは文句を言い: S4として

In [242]: np.genfromtxt(['str1', 'str2'], dtype='str') 
TypeError: Can't convert 'bytes' object to str implicitly 

ロードと後に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') 

もう1つの回避策は、converter

In [250]: np.loadtxt(['str1', 'str2'], dtype='str',converters={0:lambda x: x.decode()}) 
Out[250]: 
array(['str1', 'str2'], 
     dtype='<U4') 
+0

ありがとうございます! Numpyに対してバグレポートを提出します。 –

+0

バグレポート:https://github.com/numpy/numpy/issues/8033 –

関連する問題