解析.csv文件正在跳过一行

时间:2017-08-24 22:49:39

标签: python csv dictionary

我有一个如下所示的输入文件:

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'}

希望这是有道理的。为什么它会跳过第一行,而只跳过第一行?

1 个答案:

答案 0 :(得分:3)

使用DictReader使用标题行来确定字典键。

这意味着下一行代码会占用您的第一行数据:

headers = next(reader)

你可以摆脱那条线。如果您需要csv.DictReader对象上的标题列表,则可以执行

headers = reader.fieldnames