Python DictReader - 跳过缺少列的行?

时间:2010-05-25 01:22:22

标签: python csv

我有一个Excel .CSV文件,我试图用DictReader读取。

所有似乎都很好,除了它似乎省略了行,特别是那些缺少列的行。

我们的输入如下:

mail,givenName,sn,lorem,ipsum,dolor,telephoneNumber
ian.bay@blah.com,ian,bay,3424,8403,2535,+65(2)34523534545
mike.gibson@blah.com,mike,gibson,3424,8403,2535,+65(2)34523534545
ross.martin@blah.com,ross,martin,,,,+65(2)34523534545
david.connor@blah.com,david,connor,,,,+65(2)34523534545
chris.call@blah.com,chris,call,3424,8403,2535,+65(2)34523534545

所以有些行缺少lorem / ipsum / dolor列,而且它只是一串逗号。

我们正在阅读:

def read_gd_dump(input_file="blah 20100423.csv"):
    gd_extract = csv.DictReader(open('blah 20100423.csv'), restval='missing', dialect='excel')
    return dict([(row['something'], row) for row in gd_extract])

我检查过“某些东西”(我们的字典的关键字)不是缺少的列之一,我原本怀疑它可能是那个。这是之后的专栏之一。

然而,DictReader似乎完全跳过了行。我尝试将restval设置为某些东西,似乎没有任何区别。我似乎无法在Python的CSV文档(http://docs.python.org/library/csv.html)中找到可以解释这种行为的任何内容,但我可能误读了一些内容。

2 个答案:

答案 0 :(得分:1)

无法重现您的问题 - 当我保存该数据然后分配list(gd_extract)时,我看到了:

[{'telephoneNumber': '+65(2)34523534545', 'ipsum': '8403', 'sn': 'bay', 'dolor': '2535', 'mail': 'ian.bay@blah.com', 'givenName': 'ian', 'lorem': '3424'}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '8403', 'sn': 'gibson', 'dolor': '2535', 'mail': 'mike.gibson@blah.com', 'givenName': 'mike', 'lorem': '3424'}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '', 'sn': 'martin', 'dolor': '', 'mail': 'ross.martin@blah.com', 'givenName': 'ross', 'lorem': ''}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '', 'sn': 'connor', 'dolor': '', 'mail': 'david.connor@blah.com', 'givenName': 'david', 'lorem': ''}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '8403', 'sn': 'call', 'dolor': '2535', 'mail': 'chris.call@blah.com', 'givenName': 'chris', 'lorem': '3424'}]

五个dicts,包括那些失踪ipsum等等。我担心,在你为简化问题而做出的值得称道的尝试中,你过度地简化了它,以便你的bug消失了。

如果您在something列中有重复项(无法检查,因为您的示例数据中没有 那个列),这当然会解释“显然缺失”行 - 它们不会从csv阅读器的返回流中丢失,它们会在您返回的词典中被“覆盖”。这可能是问题吗?

答案 1 :(得分:0)

这可能与您的问题无关,而且由于缺乏信息,Alex的分析非常合理,但您应该始终打开一个"rb"或{{1}的csv文件模式(假设Python 2.X)。如果你不这样做,你就冒着各种神秘事件的风险。 csv文件不是文本文件,它是BINARY文件。

无论如何,请编辑您的问题以显示:
(1)(a)样本文件(b)脚本(c)输出 - 它们共同证明了所谓的问题 (2)你正在运行什么版本的Python (3)什么操作系统

更新:对于Python 3.X,请按the blessed manual说:“”如果"wb"是文件对象,则应使用csvfile打开它。虽然包含此建议仅适用于newline='',它同样适用于csv.readercsv.writercsv.DictReader