我有一个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)中找到可以解释这种行为的任何内容,但我可能误读了一些内容。
答案 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.reader
,csv.writer
和csv.DictReader
。