2016-01-13 93 views
1

在比較CSV文件中的行時,我偶然發現了問題。Python - 用csv.DictReader忽略len()中的空單元格

我可以使用csv.reader與len(),它工作得很好,但我然後我必須排序關鍵的文件。

我有獨特的鑰匙,所以我想用DictReader但LEN()似乎在字典閱讀所有的值,包括空單元:

with open (baseline, 'r') as baselineF: 
    readBaseline=csv.DictReader(baselineF, delimiter=',', quotechar='"')   


         for rowb in readBaseline: 

          print('rowb: ',len(rowb)) 

          with open (tested, 'r') as testedF: 
           readTested=csv.DictReader(testedF, delimiter=',', quotechar='"') 

          for rowt in readTested: 

           print ('rowt: ', len(rowt)) 


           # Rows are the same len 
           if len(rowb)==len(rowt):           
            writerSameOracle.writerow(rowb) 
            writerSameHPCC.writerow(rowt) 
            print ('Rows are the same') 
            break 

有了這個代碼,即使行具有相同數量的填充細胞的它似乎將len()=返回到每個文件中的標題數量。

回答

1

你在做什麼似乎有點混亂,但它是微不足道的過濾掉任何東西,是falsey:

>>> rowb = [1,2,0,3] 
# using list comprehension 
>>> len([x for x in rowb if x]) 
3 
# alternatively using filter in Python 2 
>>> len(filter(None, rowb)) 
3 
+0

他們都不工作: ** 1 ** LEN(過濾器(布爾,rowB中) 打印( '\ nrowb:',LEN(過濾器(布爾,rowB中))) 類型錯誤:對象('x'在x中的x,如果x!= None]))總會產生lan = to number of鍵/標題 @ 2rs2ts – Vic152

+0

在評論中閱讀代碼非常困難;要麼編寫它,以便可以在同一行中閱讀程序,或編輯問題以包括如何根據我的答案更改代碼。 ,這兩項工作都是有效的,所以你做錯了什麼,或許你有影子'過濾器'。也許你不想使用'x!= None',而只是按照我的建議使用'x'的真實性。也許你沒有正確使用過濾列表的長度。你應該提供示例輸入和預期的輸出(與實際輸出相比)。 – 2rs2ts

+0

啊,我的歉意,我忘了filter()在Python 3中有它自己的返回類型。我仍然使用Python 2.讓我調整我的答案。 – 2rs2ts

0

所以我決定加載值字典列出再算上LEN()。在此基礎上使用適當的if語句來完成這項工作。

with open (baseline, 'r') as baselineF: 
         readBaseline=csv.DictReader(baselineF,delimiter=',', quotechar='"') 

for rowb in readBaseline: 


          with open (tested, 'r') as testedF: 
           readTested=csv.DictReader(testedF, delimiter=',', quotechar='"') 


           for rowt in readTested:          

            if rowt['key'] == rowb['key']:         

             for value in rowb.values(): 

              list1.append(value) 
              cleaned1 = [x for x in list1 if x != None] 

             list1=[]             


             for value in rowt.values(): 

              list2.append(value) 
              cleaned2 = [x for x in list2 if x != None] 

             list1=[]  

             #rowb baseline 
             #rowt tested 


             #Rows are the same len 
             if len(cleaned1)==len(cleaned2):           
              writerSameOracle.writerow(rowb) 
              writerSameHPCC.writerow(rowt) 
              print ('Rows are the same) 
              break