[英]Parsing of .csv file is skipping one row
我有一个如下所示的输入文件:
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'}
希望有道理。 为什么它会跳过第一行,而只跳过第一行?
使用DictReader
使用标题行来确定字典键。
这意味着下一行代码会消耗您的第一行数据:
headers = next(reader)
你可以摆脱那条线。 如果您需要csv.DictReader
对象上的标头列表,您可以这样做
headers = reader.fieldnames
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.