2016-10-20 5 views
1

numpyのgenfromtxtを使ってtxtファイルを読みたいと思います。次のようにファイルt.txtに見える:Numpy genfromtxtは追加の不要な文字列を読み込みます

############### 
PSZ1 G096.89+24.17 
PSZ1 G108.18−11.53 
RXC J0225.1−2928 
RXC J1053.7+5452 
RXC J1234.2+0947 
RXC J1314.4−2515 
S 1081 
ZwCl 0008.8+5215 
ZwCl 2341+0000 
1E 0657−558 
1RXS J0603.3+4214 
24P 73 

私はnumpyのをインポートすると、次のようにgenfromtxt実行します。

import numpy as np 
a =np.genfromtxt("t.txt", comments="#", dtype=None,autostrip=True,delimiter = " ") 

をし、それが発行するときに、次の印刷返します

array([['PSZ1', 'G096.89+24.17'], 
     ['PSZ1', 'G108.18\xe2\x88\x9211.53'], 
     ['RXC', 'J0225.1\xe2\x88\x922928'], 
     ['RXC', 'J1053.7+5452'], 
     ['RXC', 'J1234.2+0947'], 
     ['RXC', 'J1314.4\xe2\x88\x922515'], 
     ['S', '1081'], 
     ['ZwCl', '0008.8+5215'], 
     ['ZwCl', '2341+0000'], 
     ['1E', '0657\xe2\x88\x92558'], 
     ['1RXS', 'J0603.3+4214'], 
     ['24P', '73']], 
     dtype='|S15') 

Iをgenfromtxtを使用している間に\ xを含む追加の刺し傷の原因とその乗り方を知りたいとします。

さらに、このポスト(t.txt)の例を直接txtまたはcsvファイルに直接コピーしても、文字列を読み取る他の多くの方法でも同じ問題(追加の\ x文字列)が返されます。

私は下のUTF8で言われるアトムエディタでファイルt.txtを作成しました。また、ファイルをUTF8として保存しました。

偽のコード化された+と - をPythonで手で個別に変更することなく正しく読むことができますか?

おかげPY3 Ipythonセッションで

+0

[numpy.genfromtxtを使用してPython 3でUTF-8ファイルを読み込む](http://stackoverflow.com/questions/33001373/loading-utf-8-file-in-python-3-using -numpy-genfromtxt) – Yugi

+0

私はPython 2.7を使用していますが、エラーメッセージは表示されません。また、私のtxtファイルには派手な文字はありません(私が知る限り)。 – user3063903

+1

エンコーディングのように見えますが、マイナス記号は翻訳されておらず、その代わりに "\ xe2 \ x88 \ x92"というUTF-8コードに置き換えられています。 UTF-8の読み込みに関連している必要があります。エラーはありませんが、@ yugiが提供するリンクの解決策が役立ちます。 – oxtay

答えて

0

In [847]: data=np.genfromtxt('stack40159019.txt',comments='#',dtype=None) 
In [848]: data 
Out[848]: 
array([[b'PSZ1', b'G096.89+24.17'], 
     [b'PSZ1', b'G108.18\xe2\x88\x9211.53'], 
     [b'RXC', b'J0225.1\xe2\x88\x922928'], 
     [b'RXC', b'J1053.7+5452'], 
     [b'RXC', b'J1234.2+0947'], 
     [b'RXC', b'J1314.4\xe2\x88\x922515'], 
     [b'S', b'1081'], 
     [b'ZwCl', b'0008.8+5215'], 
     [b'ZwCl', b'2341+0000'], 
     [b'1E', b'0657\xe2\x88\x92558'], 
     [b'1RXS', b'J0603.3+4214'], 
     [b'24P', b'73']], 
     dtype='|S15') 
In [849]: np.char.decode(data) 
Out[849]: 
array([['PSZ1', 'G096.89+24.17'], 
     ['PSZ1', 'G108.18−11.53'], 
     ['RXC', 'J0225.1−2928'], 
     ['RXC', 'J1053.7+5452'], 
     ['RXC', 'J1234.2+0947'], 
     ['RXC', 'J1314.4−2515'], 
     ['S', '1081'], 
     ['ZwCl', '0008.8+5215'], 
     ['ZwCl', '2341+0000'], 
     ['1E', '0657−558'], 
     ['1RXS', 'J0603.3+4214'], 
     ['24P', '73']], 
     dtype='<U13') 

が示唆重複はPY3のためですが、私はこのdecodeアプローチは、同様PY2上で動作すると思います。

Loading UTF-8 file in Python 3 using numpy.genfromtxt

PY2セッションで=====================

>>> txt=b'G108.18\xe2\x88\x9211.53' 
>>> txt 
'G108.18\xe2\x88\x9211.53' 
>>> txt.decode() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 7: ordinal not in range(128) 
>>> txt.decode('UTF-8') 
u'G108.18\u221211.53' 

>>> txt.decode(errors='replace') 
u'G108.18\ufffd\ufffd\ufffd11.53' 
>>> txt.decode(errors='ignore') 
u'G108.1811.53' 

と交換しますユニコード - アスキーと - :(バックPY3中)np.char.replaceとそう

>>> '\xe2\x88\x92'.decode('utf8') 
u'\u2212' 
>>> txt.decode('utf8').replace(u'\u2212','-') 
u'G108.18-11.53' 
>>> txt.decode('utf8').replace(u'\u2212','-').encode() 
'G108.18-11.53' 

In [872]: np.char.replace(data1,u'\u2212','-').astype('S13') 
Out[872]: 
array([[b'PSZ1', b'G096.89+24.17'], 
     [b'PSZ1', b'G108.18-11.53'], 
     [b'RXC', b'J0225.1-2928'], 
     [b'RXC', b'J1053.7+5452'], 
     [b'RXC', b'J1234.2+0947'], 
     [b'RXC', b'J1314.4-2515'], 
     [b'S', b'1081'], 
     [b'ZwCl', b'0008.8+5215'], 
     [b'ZwCl', b'2341+0000'], 
     [b'1E', b'0657-558'], 
     [b'1RXS', b'J0603.3+4214'], 
     [b'24P', b'73']], 
     dtype='|S13') 
+0

Python 2.7でUnicodeDecodeError: 'ascii'コーデックは、位置7のバイト0xe2をデコードできません:序数が範囲内にありません(128) – user3063903

+0

'data.astype( 'U20')を試してみるとエラーが表示されます'がありますが、' np.char'関数ではそうではありません。私は明示的な 'エンコード'が助けになるのだろうかと思います。 'np.char.decode(data、 'UTF8')' – hpaulj

関連する問題