2017-03-16 4 views
1

にint型の読み取りに失敗しましたnumpy.loadtxtは、私は現在、MWEの目的のために、のように見える、データファイルを持って、私はいくつかの比較的単純なPythonの2つのモジュールは、Python 3と互換性があることを確認してくださいしようとしているのPython 3

n 
0 

次のスニペットは、基本的には同じコードではPython 2.7と3.5の両方にnames=Truegenfromtxtのような動作を取得するための回避策であるのPython 2.7、と正常に動作します。 Pythonの3.5で

import numpy as np 
with open('bad_int.data', 'rb') as f: lines = f.readlines() 
data = np.loadtxt(lines[1:2], dtype=[('n', int)]) 

、私はこのようなファイルをロードする他の方法がある知っているが、それは持っているので、私は、現在の行でファイルをスライスするためにバインドされていますエラーに

Traceback (most recent call last): 
    File "bad_int3.py", line 5, in <module> 
    data = np.loadtxt(lines[1:2], dtype=[('n',int)]) 
    File "/usr/lib64/python3.5/site-packages/numpy/lib/npyio.py", line 938, in loadtxt 
    X = np.array(X, dtype) 
ValueError: invalid literal for int() with base 10: "b'0'" 

を取得複数の配列。私は先導bが意味するもの(バイナリ?)を見つけようとしていますが、運はまだありません。ですから、このエラーが出ることなくPython 2.7と3.5でこの種のデータをどのように読むことができますか?

編集

私は複数のフィールドがある場合、すべてが正常に動作していることに気付きました。したがって、たとえば、

data = np.loadtxt(lines[1:2], dtype=[('n', int), ('m', int)]) 

n m 
0 0 

と最後の行にデータが変更された場合、その後のすべては、Python 2.7と3.5で完璧に動作します。 PY3で

+0

あなたの入力ファイルは本当ですか? –

+0

Emacsを使用して自分自身でMWEの例を作成しました。私は 'echo -e" n \ n0 "> bad_int.data'でファイルに送信しようとしました。 – Warrick

+0

理想的には、フィールドの名前がファイルから 'n'であると自動的に推測したいと思いますが、私はそれをかなり簡単に行うことができます。だから、 '0'を読むだけで十分です。しかし、データがファイルの先頭になくても、必ずしも最後になるわけではありません。 – Warrick

答えて

3

あなたはバイナリモードでファイルを開く必要があります。

with open('data', 'rb') as f: 
    lines = f.readlines() 
    data = np.loadtxt(lines[1:2], dtype=[('n',int)]) 

loadtxt(およびgenfromtxt)はバイト文字列で動作します。したがって、ファイルを開くと、彼らはrbを使用します。

また、試みることができる:

data = np.loadtxt('data', skiprows=1, dtype=[('n',int)]) 

大手bは、バイト文字列を示します。 Py3文字列は、デフォルトではUnicodeです。


In [99]: txt=b"""n 
    ...: 0 
    ...: 1""" 
In [100]: np.loadtxt(txt.splitlines()[1:], dtype=int) 
Out[100]: array([0, 1]) 

が、あなたのDTYPE

In [101]: dt=np.dtype([('n',int)]) 
In [102]: np.loadtxt(txt.splitlines()[1:], dtype=dt) 
... 
ValueError: invalid literal for int() with base 10: "b'0'" 

と が、これは動作します:

In [105]: np.genfromtxt(txt.splitlines(), dtype=None, names=True) 
Out[105]: 
array([(0,), (1,)], 
     dtype=[('n', '<i4')]) 

In [103]: np.genfromtxt(txt.splitlines()[1:], dtype=dt) 
Out[103]: 
array([(0,), (1,)], 
     dtype=[('n', '<i4')]) 

それともせgenfromtxtはDTYPEを作成

したがって、loadtxtが問題を起こしているdtypeをどのように処理しているかについては何かがあります。私は以前これを見たことがない。しかし、私は1つの列だけを読み込む多くのケースを見ていません。

+0

解決策の最初の部分( 'r'を' rb'に変更する)は私のためには機能しません。実際、それは何も変えていないようです。私はあなたの2番目の提案のような何かを使用することができるようにしたいと思いますが、私の実際のデータは、必ずしもファイルの最初または最後ではありません。 – Warrick

+0

あなたの追加は間接的に、なぜ私が行のリストに 'genfromtxt'を使ってエラーを出すのかを知るようにしました。ありがとう! – Warrick

+0

あなたのソリューションに感謝します。私は "オープン"は "with" – FiReTiTi

関連する問題