Python忽略len()中的空单元格csv.DictRead

2024-09-28 04:22:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在比较CSV文件中的行时偶然发现了这个问题。在

我可以利用csv.reader使用len()可以很好地工作,但是我必须在键上对文件进行排序。在

我有唯一的键,所以我想使用DictReader,但是len()似乎读取dict中的所有值,包括空单元格:

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()=到每个文件的头数。在


Tags: 文件csvforlenaswithopenprint
2条回答

你所做的似乎有点让人困惑,但过滤掉任何虚假的东西并不重要:

>>> 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

所以我决定将dict的值加载到list,然后count 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

相关问题 更多 >

    热门问题