2011-12-07 50 views
3

我正在使用dictreader打開一些csv文件,將它們添加到一個大的字典列表中,然後使用dictwriter將字典列表寫入一個csv文件。如何忽略csv文件中的空白行

我遇到的問題是生成的csv文件在具有數據的行之間有一堆空行。我想當csv文件正在被讀取時,它不會忽略空行。

有人能請我正確的方向來找到我怎麼說忽略空白行嗎?

我試過在csv模塊中找到這個,但沒有喜悅。

任何幫助將不勝感激請。

嗨!感謝回覆! 我更希望dictreader讀取行中有任何感興趣的內容,但只有在完全空白的情況下才會忽略行。例如,如果我有

{'1': '', '2': 'two', '3': ''}, 
{'1': '', '2': '', '3': ''} 

我只是想繼續

{'1': '', '2': 'two', '3': ''} 

我發現,我

for dictionary in csv.DictReader(open(filename)): 
    if any(x != '' for x in dictionary.itervalues()): 

回答

3

以下工作。如果我理解正確的話,你只需在將其轉儲到文件之前,先過濾空白行的字典。一個簡單的例子讓你開始:

>>> d = {'l1': 'data', 'l2': ' '} 
>>> dict([(k, v) for k, v in d.iteritems() if v.strip()]) 
{'l1': 'data'} 

這有幫助嗎?

+0

嗨!感謝回覆!我更想要一些能夠讀取行的東西,如果它們中有任何感興趣的東西,但只有在完全空白時纔會忽略行。例如,如果我有{'1':'','2':'two','3':''}和{'1':'','2':'','3':''}我只想保留{'1':'','2':'two','3':''} –

4

您可以讀取跳過實際文件中空白行的假文件對象。我並不熟悉你在做什麼,但是如果空白行讓你的閱讀過程崩潰,或者你真的不想在那裏留下空行,這將比mac的答案更好。

class BlankLineSkipper(object): 
    def __init__(self, file): 
     self.file = file 
    def __iter__(self): 
     return (line for line in self.file if line.strip()) 
    def read(self): 
     return ''.join(self) 

>>> print open('lol.csv').read() 
5,7,8 

1,2,3 

abc,lol,haha 


>>> list(csv.reader(open('lol.csv'))) 
[['5', '7', '8'], [], ['1', '2', '3'], [], ['abc', 'lol', 'haha'], []] 

>>> list(csv.reader(BlankLineSkipper(open('lol.csv')))) 
[['5', '7', '8'], ['1', '2', '3'], ['abc', 'lol', 'haha']] 

(您可能需要實現readline()或別的東西使你的代碼工作,這取決於它如何使用文件對象。)

+0

嗨!感謝您的幫助:)我無法查看每本字典中的每個值。我認爲以上是處理線條列表?而不是字典?對不起,我是新手。 –

+0

使用它與csv.reader會給你列表。如果你用csv.DictReader(我以前不知道但是很酷......)做同樣的事情,它會給你字典。它是文件的替代品,而不是文件的讀取。 – Dougal

0

通過線你迭代形成dictreader,然後只「用」有價值的線條。 mac的列表理解檢查值應該是通過返回空字典清除不需要的行的正確方法。即使所有密鑰都不存在,也可以使用dictwriter對象寫出結果字典{'2':'two'}。

下面的示例執行行代碼檢查,看它是否有任何值分配。

column_headers = ["1", "2", "3"] 
dictwriter = csv.DictWriter(open("output.csv", "wb"), fieldnames=column_headers) 
for line in dictreader: 
    # check if the line contains "interesting" values. 
    # --> Result will be empty list if not and evaluate to False 
    if [True for v in line.values() if v.strip()]: 
     # line is not EMPTY, process as desired 
     dictwriter.writerow(line) 
+0

閱讀OP對mac的回答的評論......他想追加'line',而不是'cleaned_line' –

+0

John,感謝我重新閱讀了這個評論,「如果他們有任何感興趣的東西會讀取行,但是隻有在完全空白的情況下才會忽略一行「。這正是這樣做的。如果該行爲空,「cleaned_line」將爲空。您可以使用線條列表來處理這裏清理過的線條,或者在此處執行一些其他功能。 – monkut

+0

monkut,他想要的就是'如果清空線:lines.append(線)'......如他所說,他想保留'{'1':'','2':'two','3': ''}',而不是'{'2':'two'}' –