Python DictReader - 跳过缺失列的行?
我有一个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])
我检查过“something”(我们字典的键)并不是缺失的列之一,最开始我怀疑可能是这个问题。它是在那些列之后的。
然而,DictReader似乎完全跳过了这些行。我尝试把restval设置成其他值,但似乎没有任何变化。我在Python的CSV文档中找不到任何能解释这种行为的内容(http://docs.python.org/library/csv.html),可能是我看错了什么。
2 个回答
这可能和你的问题没什么关系,Alex的分析在缺乏信息的情况下也很合理,但你一定要用 "rb"
或 "wb"
模式打开csv文件(假设你用的是Python 2.X)。如果不这样做,你可能会遇到一些奇怪的问题。csv文件不是文本文件,它是一个二进制文件。
无论如何,请修改你的问题,提供以下信息:
(1) (a) 一个示例文件 (b) 一个脚本 (c) 输出结果——这些一起能展示你所说的问题
(2) 你使用的Python版本
(3) 你使用的操作系统
更新:对于Python 3.X,请按照官方手册的说明操作:"""如果 csvfile
是一个文件对象,它应该用 newline=''
打开。虽然这个建议只在 csv.reader
中提到,但同样适用于 csv.writer
、csv.DictReader
和 csv.DictWriter
。
我无法重现你遇到的问题——当我保存那些数据,然后赋值给 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'}]
五个字典,包括那些缺少 ipsum
等内容的字典。我担心你在努力简化问题时,可能把问题简化得太过了,以至于你的bug消失了。
如果你的 something
列中有重复项(我无法检查,因为你提供的样本数据里没有这个列),这当然可以解释“看似缺失”的行——它们并不是从csv读取器返回的流中消失了,而是在你返回的字典中被“覆盖”掉了。这个问题可能是原因吗?