我只收集第一个对象的键,然后假定格式的其余部分是一致的。
以下代码还将嵌套对象限制为 一个
;您没有指定当一个以上时应该发生的情况。具有两个或多个相同长度的嵌套结构可以工作(将它们“压缩”在一起),但是,如果您具有不同长度的结构,则需要做出明确的选择来处理它们。用空列压缩以填充或写出这些条目的乘积(A
x B行,每次找到B条目都从A重复信息)。
import csvfrom operator import itemgetterwith open(outputfile, 'wb') as outf: writer = None # will be set to a csv.DictWriter later for key, item in sorted(data.items(), key=itemgetter(0)): row = {} nested_name, nested_items = '', {} for k, v in item.items(): if not isinstance(v, dict): row[k] = v else: assert not nested_items, 'only one nested structure is supported' nested_name, nested_items = k, v if writer is None: # build fields for each first key of each nested item first fields = sorted(row) # sorted keys of first item in key sorted order nested_keys = sorted(sorted(nested_items.items(), key=itemgetter(0))[0][1]) fields.extend('__'.join((nested_name, k)) for k in nested_keys) writer = csv.DictWriter(outf, fields) writer.writeheader() for nkey, nitem in sorted(nested_items.items(), key=itemgetter(0)): row.update(('__'.join((nested_name, k)), v) for k, v in nitem.items()) writer.writerow(row)对于您的样本输入,将产生:
COUNTRY,ITW,VENUE,RACES__NO,RACES__TIMEHAE,XAD,JOEBURG,1,12:35HAE,XAD,JOEBURG,2,13:10HAE,XAD,JOEBURG,3,13:40HAE,XAD,JOEBURG,4,14:10HAE,XAD,JOEBURG,5,14:55HAE,XAD,JOEBURG,6,15:30HAE,XAD,JOEBURG,7,16:05HAE,XAD,JOEBURG,8,16:40ABA,XAD,FOOBURG,1,12:35ABA,XAD,FOOBURG,2,13:10ABA,XAD,FOOBURG,3,13:40ABA,XAD,FOOBURG,4,14:10ABA,XAD,FOOBURG,5,14:55ABA,XAD,FOOBURG,6,15:30ABA,XAD,FOOBURG,7,16:05ABA,XAD,FOOBURG,8,16:40



