簡體   English   中英

Python DictReader - 跳過缺少列的行?

[英]Python DictReader - Skipping rows with missing columns?

我有一個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])

我檢查了“某些東西”(我們的dict的關鍵)不是缺少的列之一,我原本懷疑它可能是那個。 這是之后的專欄之一。

但是,DictReader似乎完全跳過了行。 我嘗試將restval設置為某些東西,似乎沒有任何區別。 我似乎無法在Python的CSV文檔( http://docs.python.org/library/csv.html )中找到可以解釋這種行為的任何內容,但我可能誤讀了一些內容。

無法重現您的問題 - 當我保存該數據然后分配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閱讀的返回流失蹤,他們會在你回來的詞典中被“覆蓋”。 這可能是問題嗎?

這可能與你的問題無關,而且由於缺乏信息,Alex的分析非常合理,但你應該總是"rb""wb"模式打開一個csv文件(假設是Python 2.X)。 如果你不這樣做,你就冒着各種神秘事件的風險。 csv文件不是文本文件,它是BINARY文件。

無論如何,請編輯您的問題以顯示:
(1)(a)樣本文件(b)腳本(c)輸出 - 它們共同證明了所謂的問題
(2)您正在運行的Python版本
(3)什么操作系統

更新:對於Python 3.X,請按照受祝福的手冊說:“”如果csvfile是文件對象,則應使用newline=''打開。雖然此建議僅包含在csv.reader ,但它同樣適用於csv.writercsv.DictReadercsv.DictWriter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM