从 csv 文件构建 Python 字典时如何跳过空白单元格?

How to skip over blank cells when constructing a Python dictionary from a csv file?

我有一个结构如下的 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 列。

我知道这里有类似的问题,但 none 似乎是我要寻找的关于我希望如何读取文件的问题。

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

您可以使用 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)

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

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='' 打开。

也许有更好的方法,但您可以仅在存在时添加密钥并过滤结果。

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 filter returns直接一个list,这样就可以避免调用list了。

编辑: 仔细想想,一个完全空的行本来就不应该出现在数据中。因此,您可能可以删除 row[0].

的 if 语句