我有一个如下所示的输入文件:
SET,LAYOUT,LAYER,NAME
RESTAURANT,RR_FACING1,BACKDROP,restaurant1
RESTAURANT,RR_FACING1,BACKGROUND,chairs1
RESTAURANT,RR_FACING2,BACKDROP,restaurant2
RESTAURANT,RR_FACING3,BACKDROP,restaurant1
RESTAURANT,RR_FACING3,FOREGROUND,potted_plant1
SPACE,SPACE1,BACKDROP,starfield1
SPACE,SPACE2,BACKDROP,starfield2
SPACE,SPACE2,BACKGROUND,planet1
SPACE,SPACE2,FOREGROUND,spaceship1
FOREST,FOREST1,BACKDROP,forest1
FOREST,FOREST1,BACKGROUND,trees1
FOREST,FOREST1,FOREGROUND,bushes1
我编写了以下代码来解析它。不包括导入语句:
full_path_to_file = 'C:\\SAMPLE_INFO.csv'
openfile = open(full_path_to_file)
reader = csv.DictReader(openfile)
headers = next(reader)
layouts_schema = {}
for group1, records1 in itertools.groupby(reader, key=operator.itemgetter("SET")):
layouts_schema[group1] = {}
for group2, records2 in itertools.groupby(records1, key=operator.itemgetter("LAYOUT")):
layouts_schema[group1][group2] = list(records2)
除了一个问题外,这很有效。它会跳过键组合RESTAURANT / RR_FACING1 / BACKDROP的第一行/值。它会正确地拉出所有内容,除了标题之后的第一行。因此输出是这样的:
{'FOREST': {'FOREST1': [{'LAYER': 'BACKDROP',
'LAYOUT': 'FOREST1',
'NAME': 'forest1',
'SET': 'FOREST'},
{'LAYER': 'BACKGROUND',
'LAYOUT': 'FOREST1',
'NAME': 'trees1',
'SET': 'FOREST'},
{'LAYER': 'FOREGROUND',
'LAYOUT': 'FOREST1',
'NAME': 'bushes1',
'SET': 'FOREST'}]},
'RESTAURANT': {'RR_FACING1': [{'LAYER': 'BACKGROUND',
'LAYOUT': 'RR_FACING1',
'NAME': 'chairs1',
'SET': 'RESTAURANT'}],
'RR_FACING2': [{'LAYER': 'BACKDROP',
'LAYOUT': 'RR_FACING2',
'NAME': 'restaurant2',
'SET': 'RESTAURANT'}],
'RR_FACING3': [{'LAYER': 'BACKDROP',
'LAYOUT': 'RR_FACING3',
'NAME': 'restaurant1',
'SET': 'RESTAURANT'},
{'LAYER': 'FOREGROUND',
'LAYOUT': 'RR_FACING3',
'NAME': 'potted_plant1',
'SET': 'RESTAURANT'}]},
'SPACE': {'SPACE1': [{'LAYER': 'BACKDROP',
'LAYOUT': 'SPACE1',
'NAME': 'starfield1',
'SET': 'SPACE'}],
'SPACE2': [{'LAYER': 'BACKDROP',
'LAYOUT': 'SPACE2',
'NAME': 'starfield2',
'SET': 'SPACE'},
{'LAYER': 'BACKGROUND',
'LAYOUT': 'SPACE2',
'NAME': 'planet1',
'SET': 'SPACE'},
{'LAYER': 'FOREGROUND',
'LAYOUT': 'SPACE2',
'NAME': 'spaceship1',
'SET': 'SPACE'}]}}
缺少以下部分,这应该是RESTAURANT分组中的第一件事:
{'LAYER': 'BACKDROP',
'LAYOUT': 'RR_FACING1',
'NAME': 'restaurant1',
'SET': 'RESTAURANT'}
希望这是有道理的。为什么它会跳过第一行,而只跳过第一行?
答案 0 :(得分:3)
使用DictReader
使用标题行来确定字典键。
这意味着下一行代码会占用您的第一行数据:
headers = next(reader)
你可以摆脱那条线。如果您需要csv.DictReader
对象上的标题列表,则可以执行
headers = reader.fieldnames