2016-07-20 5 views
0

Я использую genfromtxt для чтения данных.чтение сжатых данных дает разные результаты

genfromtxt должен работать и для файлов .gz, но, похоже, это не так.

Используя простые данные (не .gz файлы) содержание

f = open('file', 'r') 
con = np.genfromtxt(f,dtype=str) 

print con 
print type(con) 

файл является:

@HWI 
    ABCDE 
    + 
    @HWI7 
    EFSA 
    + 
    ???=AF 
    [email protected] 
    GVTAWM 

и выход выше код:

['@HWI' 'ABCDE' '+' '@HWI7' 'EFSA' '+' '???=AF' '[email protected]' 'GVTAWM'] 
<type 'numpy.ndarray'> 

Если я просто использовать тот же код с файлом aboce, сжатым как .gz-файл, выход:

[ "\x1f\x8b\x08\x08\x1b4\x8eW\x00\x03file\x00Sp\xf0\x08\xf7\xe4R\x00\x02G'g\x17W0K\x1bL\x82$\xcc\xc1,W\xb7`G$" 
'{{{[G70\xd3=\xc45\xd2\xc1' '\xca\x0e' 'q' '\xf7\x05' '\x06\x07\xc2P'] 
<type 'numpy.ndarray'> 

И проблема в том, что я хочу выполнить некоторые вычисления позже, и мне это не понравится.

Я попробовал также (для версии .gz):

with gzip.open(file, 'r') as f: 
    con = np.array([f.read()]) 

print con 
print type(con) 

, который дает:

[ ' @HWI\n ABCDE\n +\n @HWI7\n EFSA\n +\n ???=AF\n [email protected]\n GVTAWM'] 
<type 'numpy.ndarray'> 

который ближе к первоначальному, но по-прежнему не работает (не может двигаться дальше с расчетами)

Как я могу достичь того же результата?

+0

Почему вы не используете 'genfromtxt' с файловым объектом из' gzip.открытый() '? – resi

+0

вы пробовали 'gzip.open (" file "," rt ")'? По defualt 'gzip.open' открывается как двоичный –

+0

@MutationalMeltdown: Я просто попробовал его. Остался тот же – George

ответ

1

Почему вы не используете genfromtxt с файловым объектом от gzip.open()?

with gzip.open('file.gz') as f: 
    print(numpy.genfromtxt(f, dtype=str)) 

EDIT

numpy использует предустановленные открывалки файлов для .gz и .bz2 файлов. Вы можете проверить конфигурацию как:

import numpy.lib._datasource as DS 
DS._file_openers._load() 
print(DS._file_openers._file_openers) 

На моей машине это показывает обработчики для BZ2 и GZ файлы:

{'.bz2': <type 'bz2.BZ2File'>, None: <built-in function open>, '.gz': <function open at 0x7efca562a6e0>} 

Поскольку обработчик для GZ файлов на самом деле gzip.open, это кажется странным, что NumPy Безразлично» t используйте его на своей машине.

+0

Даже если это простое решение, оно оставляет вас ответственным за обработку имен файлов/типов файлов. 'numpy.genfromtxt' должен работать как указано @rectummelancolique и сделает это для вас прозрачно. – resi

+0

Я отредактировал свой ответ, чтобы указать открыватели файлов numpy. Возможно, вы столкнулись с вашим PYTHONPATH или sys.path? – resi

+0

: Нет, отметьте мой комментарий к ответу rectummelancolique. '' F = open ('file', 'r') 'была проблема – George

2

Из документации:

genfromtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None) 
    Load data from a text file, with missing values handled as specified. 

    Each line past the first `skip_header` lines is split at the `delimiter` 
    character, and characters following the `comments` character are discarded. 

    Parameters 
    ---------- 
    fname : file or str 
     File, filename, or generator to read. If the filename extension is 
     `.gz` or `.bz2`, the file is first decompressed. Note that 
     generators must return byte strings in Python 3k. 

Для версии GZIP, вы должны попробовать передавая непосредственно имя файла (с .gz расширения для сжатых файлов

теста данные:.

$> cat ./test.txt 
@HWI 
    ABCDE 
     + 
      @HWI7 
       EFSA 
        + 
         ???=AF 
          [email protected] 
           GVTAWM 

$> gzip --stdout ./test.txt > ./test.txt.gz 

Тогда в питоне:

>>> import numpy as np 
>>> np.genfromtxt('./test.txt', dtype=str) 
array(['@HWI', 'ABCDE', '+', '@HWI7', 'EFSA', '+', '???=AF', '[email protected]', 
     'GVTAWM'], 
     dtype='<U7') 
>>> np.genfromtxt('./test.txt.gz', dtype=str) 
array(['@HWI', 'ABCDE', '+', '@HWI7', 'EFSA', '+', '???=AF', '[email protected]', 
     'GVTAWM'], 
     dtype='<U7') 
+0

Да, я пробовал это. Остался тот же – George

+0

Я просто попробовал его здесь, и он работает для меня, я отредактирую свой ответ, чтобы показать, как это сделать. – rectummelancolique

+0

Хм .. Я только нашел, почему это не сработало для меня. Я должен удалить эту строку 'f = open ('file', 'r')', и тогда она работает, как вы говорите! (Я выбрал ответ, вот почему я поддерживаю вас, спасибо!) Если вы хотите обновить свой ответ в соответствии с удалением строки. – George

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