2014-09-23 2 views
3

Я пытаюсь открыть часть файла csv, используя pandas read_csv. Секция Я открываю имеет заголовок в строке 746, и переходит в линию 1120.Почему pandas read_csv не читает правильное количество строк?

gr = read_csv(inputfile,header=746,nrows=374,index_col=False) 

тогда я получаю ошибку

CParserError: Error tokenizing data. C error: Expected 9 fields in line 1121, saw 17 

ошибка имеет смысл, потому что в строке 1121 файла, данные меняются от 9 полей до 17. Что не имеет смысла, так это то, почему он пытается прочитать строку 1121, так как стрелки и заголовки должны открывать только строки до 1120.

Я могу заставить его работать, уменьшая количество строк ниже 232. Это все еще работает, даже если я увеличиваю номер заголовка, чтобы он начинал r вниз по файлу (например, увеличьте его до 800).

В последней строке, которую он будет читать, не будет ничего особенного, и он будет читать строки в файле, если я увеличу номер заголовка.

Я использую Python 2.7 и pandas 0.14.

файла, который я пытаюсь читать как выглядит:

"River Levels","GRETA_SOUTH  (C)","GLENROWAN  (C)","ROCKY_POINT  (C)","DOCKER_RD  (C)","BOBINAWARRAH  (C)","WOOLSHED   (C)","WANGARATTA  (C)","PEECHELBA_EAST (C)" 
41812.00001,   0.70,   0.00,   0.00,   0.20,   0.00,   0.00,   7.30,  125.00 
41812.04168,   0.70,   0.00,   0.00,   0.20,   0.00,   0.00,   7.30,  125.00 

Почему она пытается открыть линию 1121, когда Nrows + заголовок меньше, чем это, и почему он будет читать только 232 строк, прежде чем он делает это?

+0

Также УРОВНИ РЕКИ! Тема, близкая моему сердцу! (Я больше не могу +1!) –

ответ

1

Если я не буду читать документы неправильно это выглядит как ошибка в read_csv (я рекомендую заполнение вопрос о GitHub!).

Обходной, так как ваши данные низковат (читай в линиях как строка):

from StringIO import StringIO 
with open(inputfile) as f: 
    df = pd.read_csv(StringIO(''.join(f.readlines()[:1120])), header=746, nrows=374) 

Я испытал это с CSV вы предоставляете, и она работает/не поднимает!

+0

Спасибо, что сработал. Я буду поднимать это как вопрос о github. –

+0

@ChrisLeahy: Вы отправили его на GitHub? Этот вопрос, похоже, все еще существует два года спустя в Пандасе 0,19! –

+2

Для тех, кто все еще сталкивается с этим, это была ошибка, и она должна быть исправлена ​​в 0.19.2. Использование engine = 'python' - наилучшее решение до тех пор. –

0

Я считаю, что это одна ошибка/счет (пользователь)! То есть pd.read_csv(inputfile, header=746, nrows=374) читает строку 1021st 1-indexed, поэтому вы должны прочитать еще одну строку. Я могу ошибаться, но вот что я имею в виду ...


В линии индексации питона (как и большинство питона индексации) начинается с 0.

In [11]: s = 'a,b\nA,B\n1,2\n3,4\n1,2,3,4' 

In [12]: for i, line in enumerate(s.splitlines()): print(i, line) 
0 a,b 
1 A,B 
2 1,2 
3 3,4 
4 1,2,3,4 

обычно образом вы думать номеров строк от 1:

In [12]: for i, line in enumerate(s.splitlines(), start=1): print(i, line) 
1 a,b 
2 A,B 
3 1,2 
4 3,4 
5 1,2,3,4 

В дальнейшем мы читаем вверх по 3-й ряд (с питоном индексации) или 4 (с 1-индексирование):

In [13]: pd.read_csv(StringIO(s), header=1, nrows=2) # Note: header + nrows == 3 
Out[13]: 
    A B 
0 1 2 
1 3 4 

И если мы включаем следующую строку он будет поднимать:

In [15]: pd.read_csv(StringIO(s), header=1, nrows=3) 
CParserError: Error tokenizing data. C error: Expected 2 fields in line 5, saw 4 
+0

Спасибо. Мне достаточно новичка, чтобы сделать эту ошибку, но я не думаю, что это происходит в этом случае.Если бы это было так, изменив количество строк с 374 до 373, исправить это, но мне нужно изменить его на что-то гораздо меньшее, чтобы оно работало. –

+0

Что вам нужно изменить? Может быть, есть еще один скандал? –

+0

231 - это самое высокое, что я могу. Странная часть состоит в том, что если я увеличиваю линию головы (например, до 800), она все равно работает до тех пор, пока я не увеличиваю количество строк, прошедших 231. –

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