2014-09-12 2 views
1

Я пытаюсь разобрать cities5000.txt с сайта geonames.org() с модулем csv python и получить очень странное поведение: cvs не разбивают все строки в файле.Странное поведение модуля csv python - не разбивать записи

, например:

>>> len(open('cities5000.txt').read().splitlines()) 
46955 
>>> len(list(csv.reader(open('cities5000.txt')))) 
46955 
# but here comes some fun 
>>>len(list(csv.reader(open('cities5000.txt'), delimiter='\t'))) 
46048 

и '\t' - это фактический разделитель, используемый в этом файле. Таким образом, существует около 900 записей, которые только что признаны как часть полей других записей. Но все остальное прекрасно разбирается в анализируемых данных.

Вопрос в том, в чем причина этого и как я могу избежать его, не разбивая все эти записи вручную?

+0

У меня есть другой результат с этим файлом. Первые две печати '46957' и последняя вызывают ошибку. –

+0

@LevLevitsky то же самое, что последнее поднимает '_csv.Error: поле больше предела поля (131072)' – Gnijuohz

+0

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

ответ

1

Диалект по умолчанию также указывает символ кавычки, который может использоваться для выхода из новой строки. Вы можете переопределить его с помощью quotechar=None.

>>> len(open('cities5000.txt').read().splitlines()) 
46957 
>>> len(list(csv.reader(open('cities5000.txt'), delimiter='\t'))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
_csv.Error: field larger than field limit (131072) 
>>> len(list(csv.reader(open('cities5000.txt'), delimiter='\t', quotechar=None))) 
46957 
+0

Oh. Спасибо, это действительно работает и довольно очевидно. – Cassum

0

Я думаю, что разделитель по умолчанию определяется диалектом по умолчанию «отличиться» (https://docs.python.org/2/library/csv.html#csv-fmt-params)

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

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

EDIT: короткий поиск по Google, и вы найдете это: https://github.com/oamasood/GeonamesPy Возможно, это также помогает.

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