2014-09-12 49 views
1

我想從geonames.org(http://download.geonames.org/export/dump/cities5000.zip)與python的csv模塊解析cities5000.txt並獲得非常奇怪的行爲:cvs不分割文件中的所有行。奇怪的python csv模塊的行爲 - 不要分裂記錄

例如:

>>> 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」和最後一個打印出錯。 – 2014-09-12 13:07:13

+0

@LevLevitsky與最後一個提高'_csv.Error:字段大於字段限制(131072)' – Gnijuohz 2014-09-12 13:08:21

+0

相同,這實際上是同樣的問題 - 它試圖將很多行放入一個字段。也許,我有一箇舊版本的文件,所以數據有點不同。無論如何,我已經有一個答案,謝謝你試圖幫助 – Cassum 2014-09-12 13:20:51

回答

1

默認方言還指定了一個引號char,它可以用來轉義換行符。您可以用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

哦。謝謝,這真的很有用,而且很明顯。 – Cassum 2014-09-12 13:17:34

0

我覺得默認的分隔符是默認的話「卓越」(https://docs.python.org/2/library/csv.html#csv-fmt-params

定義,我不知道哪一種是分隔符,但我覺得定義分隔符自己給你更多的控制如何分割你的數據。

我也可以想象一些城市名稱和UTF8編碼問題(不確定,只是作爲進一步研究的暗示)。

編輯:簡短的谷歌搜索,你會發現這個:https://github.com/oamasood/GeonamesPy 也許這也有幫助。