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

时间:2018-01-31 18:10:22

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

我有一个具有这种结构的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列。

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

我已经坚持了一段时间,所以任何帮助都会非常感激。

3 个答案:

答案 0 :(得分: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=''打开该文件。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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语句。