奇怪的python csv模块行为 - 不要拆分记录

时间:2014-09-12 12:54:56

标签: python csv geonames

我正在尝试使用python的csv模块从geonames.org(http://download.geonames.org/export/dump/cities5000.zip)解析cities5000.txt并获得非常奇怪的行为:cvs不会拆分文件中的所有行。

例如:

>>> 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条记录被认为是其他记录领域的一部分。但其他一切在解析数据中都很好。

问题是:这是什么原因以及如何在不手动拆分所有这些记录的情况下逃脱它?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为默认的分隔符是由默认方言'excel'(https://docs.python.org/2/library/csv.html#csv-fmt-params)定义的

我不知道哪种分隔符,但我认为自己定义分隔符可以让您更好地控制如何分割数据。

我还可以想象一下城市名称和UTF8编码的一些问题(不确定,只是作为进一步研究的暗示)。

编辑:点击谷歌搜索,你会发现:https://github.com/oamasood/GeonamesPy 也许这也有帮助。