2015-12-01 2 views
0

Я пытаюсь импортировать txt со строками и столбцами чисел, используя функцию numpy.genfromtxt. По существу мне нужен массив строк. Вот пример txt, который дает мне проблемы:numpy genfromtxt проблемы с .txt input

H2S 1.4 
    C1 3.6 

txt кодируется как unicode. Вот код, я использую:

import numpy as np   
decodf= lambda x: x.decode('utf-16') 
sample = np.genfromtxt(('ztest.txt'), dtype=str, 
         converters = {0:decodf, 1:decodf}, 
            delimiter='\t', 
            usecols=0) 
print(sample) 

Вот результат:

['H2S' 'None'] 

Я попробовал несколько способов исправить эту проблему. По не поставив DTYPE = None и устранение конвертера, я получаю:

[b'\xff\xfeH\x002\x00S' b'\x00g\x00\xe8\x00n'] 

Я также попытался избавляя от преобразователя и положить DTYPE = ул и получил:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 

Я понимаю, что это хлопотно функция. Я видел разные варианты (например: here), но не смог заставить кого-либо работать.

Что я делаю неправильно? Тем временем я смотрю на Pandas ... Заранее спасибо

ответ

1

Ваш файл кодируется как UTF-16, а первые два символа - BOM.

Попробуйте (с Python 2.7):

import io 
import numpy as np 

with io.open('ztest.txt', 'r', encoding='UTF-16') as f: 
    data = np.genfromtxt(f, delimiter='\t', dtype=None, usecols=[0]) # or dtype=str 

genfromtxt имеет некоторые проблемы при запуске в Python 3 с файлами Unicode. Как обход, вы можете просто закодировать строки перед тем, как передать их genfromtxt. Например, следующий кодирует каждую строку в Latin-1 перед передачей строки genfromtxt:

import io 
import numpy as np 

with io.open('ztest.txt', 'r', encoding='UTF-16') as f: 
    lines = [line.encode('latin-1') for line in f] 
    data = np.genfromtxt(lines, delimiter='\t', dtype=None, usecols=[0]) 
+0

Привет, спасибо за ответ. Ваш код дает 'TypeError: Невозможно преобразовать объект 'bytes' в str неявно. – Mstaino

+0

А, правильно. Я использовал python 2.7. Я получаю ту же ошибку, когда я использую python 3.4. –

Смежные вопросы