2016-09-21 3 views
0

Я хотел бы прочитать в этом файле (test.txt)NumPy genfromxt TypeError: Тип данных не понял ошибка

01.06.2015;00:00:00;0.000;0;-9.999;0;8;0.00;18951;(SPECTRUM)ZERO(/SPECTRUM) 
01.06.2015;00:01:00;0.000;0;-9.999;0;8;0.00;18954;(SPECTRUM)ZERO(/SPECTRUM) 
01.06.2015;00:02:00;0.000;0;-9.999;0;8;0.00;18960;(SPECTRUM)ZERO(/SPECTRUM) 
01.06.2015;09:23:00;0.327;61;25.831;39;29;0.18;19006;01.06.2015;09:23:00;0.327;61;25.831;39;29;0.18;19006;(SPECTRUM);;;;;;;;;;;;;;1;1;;;1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1;;;;;;;;;;;;(/SPECTRUM) 
01.06.2015;09:24:00;0.000;0;-9.999;0;29;0.00;19010;(SPECTRUM)ZERO(/SPECTRUM) 

... Я попробовал его с функцией NumPy genfromtxt() (см ниже в фрагмент кода).

import numpy as np 
col_names = ["date", "time", "rain_intensity", "weather_code_1", "radar_ref", "weather_code_2", "val6", "rain_accum", "val8", "val9"] 
types = ["object", "object", "float", "uint8", "float", "uint8", "uint8", "float", "uint8","|S10"] 
# Read in the file with np.genfromtxt 
mydata = np.genfromtxt("test.txt", delimiter=";", names=col_names, dtype=types) 

Теперь, когда я выполняю код я получаю следующее сообщение об ошибке ->

raise ValueError(errmsg)ValueError: Some errors were detected ! 
    Line #4 (got 79 columns instead of 10) 

Теперь я думаю, что трудности приходят из последнего столбца (знач9) с многими ;;;;;;;
Это очевидно, что демиметры и знаки в последнем столбце ; одинаковы!

Как я могу прочитать в файле без ошибок, возможно, есть возможность пропустить последний столбец или заменить ; только в последнем столбце?

+0

Ошибка названия не соответствует текстовой ошибкеr. – hpaulj

ответ

0

usecols может быть использован для игнорировать избыточные разделители, например

In [546]: np.genfromtxt([b'1,2,3',b'1,2,3,,,,,,'], dtype=None, 
    delimiter=',', usecols=np.arange(3)) 
Out[546]: 
array([[1, 2, 3], 
     [1, 2, 3]]) 
+0

да, вы правы, это работает и для приведенного выше примера, много thxs! – Markus

2

От numpy documentation

invalid_raise : bool, optional
If True, an exception is raised if an inconsistency is detected in the number of columns. If False, a warning is emitted and the offending lines are skipped.

mydata = np.genfromtxt("test.txt", delimiter=";", names=col_names, dtype=types, invalid_raise = False) 

Обратите внимание, что были ошибки в коде, который я отрегулирован (разделитель написан неправильно, и types список упоминается как dtypes в вызове функции)

Редактировать: Из вашего комментария, я вижу, что я немного неправильно понял. Вы имели в виду, что хотите пропустить последний столбец не последний ряд.

Посмотрите на следующий код. Я определил генератор, который возвращает только первые десять элементов каждой строки. Это позволит завершить genfromtxt() без ошибок, и теперь вы получите столбец №3 из всех строк.

Обратите внимание, что вы все равно потеряете некоторые данные, как если бы вы внимательно посмотрели, вы увидите, что проблемная линия на самом деле состоит из двух линий, соединенных вместе с мусором, где у других линий есть ZERO. Таким образом, вы все равно проиграете вторую линию. Вы могли бы, возможно, изменить генератор для разбора каждой строки и иметь дело с этим по-разному, но я оставлю это как весело упражнение :)

import numpy as np 

def filegen(filename): 
    with open(filename, 'r') as infile: 
     for line in infile: 
      yield ';'.join(line.split(';')[:10]) 

col_names = ["date", "time", "rain_intensity", "weather_code_1", "radar_ref", "weather_code_2", "val6", "rain_accum", "val8", "val9"] 
dtypes = ["object", "object", "float", "uint8", "float", "uint8", "uint8", "float", "uint8","|S10"] 
# Read in the file with np.genfromtxt 
mydata = np.genfromtxt(filegen('temp.txt'), delimiter=";", names=col_names, dtype = dtypes) 

Выходного

[('01.06.2015', '00:00:00', 0.0, 0, -9.999, 0, 8, 0.0, 7, '(SPECTRUM)') 
('01.06.2015', '00:01:00', 0.0, 0, -9.999, 0, 8, 0.0, 10, '(SPECTRUM)') 
('01.06.2015', '00:02:00', 0.0, 0, -9.999, 0, 8, 0.0, 16, '(SPECTRUM)') 
('01.06.2015', '09:23:00', 0.327, 61, 25.831, 39, 29, 0.18, 62, '01.06.2015') 
('01.06.2015', '09:24:00', 0.0, 0, -9.999, 0, 29, 0.0, 66, '(SPECTRUM)')] 
+0

ах ОК спасибо за помощь и редактирование моих ошибок. – Markus

+0

@ SiHa, хорошо, спасибо за помощь и редактирование моих ошибок. Если я помещаюсь в команду (invalid_raise = False), а строка отверстия # 4 удаляется. Но мне нужна эта строка (мне нужно, соответственно, третий столбец в каждой строке). Поскольку файл .txt длиннее и всегда имеет значения в colum # 3, с которым я перепробовал. Поэтому, когда есть ;;;;;;;; - знаки в последнем столбце, мне нужен столбец # 3! Thxs – Markus

+0

@Markus См. Обновленный ответ, но обратите внимание, что будет трудно сохранить * все * данные, справляясь с неверными линиями. – SiHa

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

  • Нет связанных вопросов^_^