我有一个具有这种结构的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列。
我知道这里有类似的问题,但就我希望如何阅读文件而言,它们似乎都不是我想要的。
我已经坚持了一段时间,所以任何帮助都会非常感激。
答案 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语句。