【问题标题】:How to skip over blank cells when constructing a Python dictionary from a csv file?从 csv 文件构建 Python 字典时如何跳过空白单元格?
【发布时间】:2018-07-10 22:52:56
【问题描述】:

我有一个具有这种结构的 csv 文件:

Name:   Tags:   col4    col4    col5    col6    col7
T1      G1      G2      G3      G4      G5  
T2      G1      G2              
T3      G1      G2      G3          
T4      G1      G2      G3      G4      G5      G6
T5      G1      G2      G3      G4      

实际文件有 279 列,所有行的长度都不同。我的目标是将每个名称作为键,然后将相应的标签作为 python 字典中的值列表。

我当前的代码是这样的:

import csv

my_dict = {}
with open('infile.csv') as file:
    reader = csv.reader(file)
    for row in reader:
        my_dict[row[0]] = row[1:]
print(my_dict)

这可行,但空白单元格作为值包含在字典中,例如;

{T1: ['G1', 'G2', 'G3', 'G4', 'G5', ''], T2: ['G1', 'G2', '', '', '', ''] etc.

而我的目标是得到这个:

{T1: ['G1', 'G2', 'G3', 'G4', 'G5'], T2: ['G1', 'G2'] etc.

我找不到任何跳过空白单元格的 csv.reader 选项。我试过 csv.DictReader (显然这会自动忽略空白单元格?)但它不允许切片,我无法命名和指定 279 列。

我知道这里有类似的问题,但就我希望如何读取文件而言,它们似乎都不是我想要的。

我已经坚持了一段时间,所以任何帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x csv dictionary skip


    【解决方案1】:

    您可以使用列表推导来选择非空单元格,如下所示:

    import csv
    
    my_dict = {}
    
    with open('infile.csv', newline='') as f_input:
        csv_input = csv.reader(f_input)
        header = next(csv_input)   # skip over the header row
    
        for row in csv_input:
            my_dict[row[0]] = [cell for cell in row[1:] if cell]
    
    print(my_dict)        
    

    给你my_dict 包含:

    {'T1': ['G1', 'G2', 'G3', 'G4', 'G5'], 'T2': ['G1', 'G2'], 'T3': ['G1', 'G2', 'G3'], 'T4': ['G1', 'G2', 'G3', 'G4', 'G5', 'G6'], 'T5': ['G1', 'G2', 'G3', 'G4']}
    

    注意:使用 Python 3.x 时,与 CSV 对象一起使用时,文件应使用 newline='' 打开。

    【讨论】:

      【解决方案2】:

      您可以使用list comprehension。

      import csv
      
      my_dict = {}
      with open('infile.csv') as file:
          reader = csv.reader(file)
          for row in reader:
              my_dict[row[0]] = [x for x in row[1:] if x!= ""]
      print(my_dict)
      

      【讨论】:

        【解决方案3】:

        也许有更好的方法,但您只能在存在的情况下添加密钥并过滤结果。

        import csv
        my_dict = {}
        with open('infile.csv') as file:
            reader = csv.reader(file)
            for row in reader:
                if row[0]:
                    my_dict[row[0]] = list(filter(None, row[1:]))
        print(my_dict)
        

        在 Python 2.7 中过滤器直接返回一个列表,因此可以避免在其上调用列表。

        编辑: 考虑一下,一开始就不应该在数据中出现一个完全空的行。因此,您可能可以删除 row[0] 的 if 语句。

        【讨论】:

        • 谢谢,不管有没有 if 语句,这似乎都一样。
        猜你喜欢
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多