2016-01-13 3 views
1

Я наткнулся на проблему при сравнении строк в файлах CSV.Python - игнорировать пустые ячейки в len() с csv.DictReader

Я мог бы использовать 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 (фильтр (BOOL, rowb) печать ('\ nrowb:', длина (фильтр (BOOL, rowb))) TypeError: объект типа 'filter' не имеет len() ** 2. ** print ('\ nrowb:', len ([x for x in rowb if x! = None])) всегда будет производить lan = до числа ключи/заголовки @ 2rs2ts – Vic152

+0

Чрезвычайно сложно прочитать ваш код в комментарии, либо напишите его так, чтобы программа могла быть прочитана в одной строке, либо отредактировала свой вопрос, чтобы включить в себя, как вы изменили код на основе моего ответа. , обе эти работы, поэтому вы делаете что-то неправильно. Возможно, вы затенены «фильтр». Возможно, вы не хотели использовать 'x! = None', а скорее правду' x', как я рекомендовал. Возможно, вы не используете длину отфильтрованного списка правильно. Вы должны предоставить пример ввода и ожидаемый результат (по сравнению с фактическим выходом.) – 2rs2ts

+0

А, мои извинения, я забыл, что 'filter()' имеет свой собственный тип возвращаемого значения теперь в Python 3. Я все еще использую Python 2. Позвольте мне настроить мой ответ. – 2rs2ts

0

Так что я решил загрузить значения для Dict в список, а затем рассчитывать 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 
Смежные вопросы