2016-10-20 9 views
1

Я хочу прочитать txt-файл, используя genfromtxt от numpy. Файл 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 хотел бы знать, что вызывает дополнительные укусы, содержащие \ x и как их проехать, при этом используя genfromtxt.

Кроме того, многие другие методы чтения строк возвращают ту же проблему (дополнительные строки \ x) даже при непосредственном копировании примера из этого сообщения (t.txt) непосредственно в файл txt или csv.

Я создал файл t.txt в редакторе атомов, который говорит в нижней UTF8. Я также сохранил файл снова как UTF8.

Как я могу правильно прочитать ложно закодированные знаки + и - в питоне, не меняя их индивидуально вручную?

Благодаря

+0

Возможный дубликат [Загрузка файла UTF-8 в Python 3 с помощью numpy.genfromtxt] (http://stackoverflow.com/questions/33001373/loading-utf-8-file-in-python-3-using -numpy-genfromtxt) – Yugi

+0

Я использую python 2.7, и я не получаю сообщение об ошибке. Кроме того, в моем txt-файле нет (как я могу сказать) модных писем). – user3063903

+1

Похоже, что в кодировке знак минус не переводится и вместо этого заменяется кодом UTF-8 для него «\ xe2 \ x88 \ x92». Это должно быть связано с загрузкой UTF-8. Нет ошибки, но решение по ссылке, предоставленной @yugi, должно помочь. – oxtay

ответ

0

В PY3 IPython сессии:

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' 

и заменить юникода - с ASCII -:

>>> '\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' 

Так с np.char.replace (обратно в PY3)

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 не может декодировать байт 0xe2 в позиции 7: порядковый номер не в диапазоне (128) – user3063903

+0

Я получаю эту ошибку при попытке 'data.astype ('U20') ', но не с функцией' np.char'. Интересно, поможет ли явное шифрование? 'Np.char.decode (данные, 'utf8')' – hpaulj