【问题标题】:Python - ignore empty cells in len() with csv.DictReaderPython - 使用 csv.DictReader 忽略 len() 中的空单元格
【发布时间】:2016-01-13 17:58:42
【问题描述】:

我在比较 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() = 返回到每个文件中的标题数。

【问题讨论】:

    标签: python excel csv dictionary cells


    【解决方案1】:

    你在做什么似乎有点混乱,但过滤掉任何虚假的东西是微不足道的:

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

    【讨论】:

    • 它们都不起作用:1. len(filter(bool, rowb) print('\nrowb: ',len(filter(bool, rowb))) 类型错误: 'filter' 类型的对象没有 len() 2. print('\nrowb: ',len([x for x in rowb if x != None])) 总是会产生 lan=to @2rs2ts 的键/标题数
    • 在评论中阅读您的代码非常困难;要么编写它以便可以在一行中读取程序,要么编辑您的问题以包括您如何根据我的回答更改代码。无论如何,这两个都有效,所以你做错了什么。也许您已经关注filter。也许您不想使用x != None,而只想使用我推荐的x 的真实性。也许您没有正确使用过滤列表的长度。您应该提供示例输入和预期输出(与实际输出相比)。
    • 啊,抱歉,我忘了filter() 现在在 Python 3 中有自己的返回类型。我仍然使用 Python 2。让我调整一下答案。
    • rowb 是字典而不是列表,所以我不知道理解是否有效。可能不是? @2rs2ts
    • 您只需使用 rowb.values() 代替。
    【解决方案2】:

    所以我决定将 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2021-05-24
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多