CSV文件的词典列表

时间:2018-03-05 13:21:56

标签: python csv dictionary

我有一个词典列表:

[   defaultdict(<class 'dict'>,
                {   'account_id': '',
                    'address': {   'address_country': 'ZM',
                                   'city': 'North Matthewland',
                                   'state': 'Nevada',
                                   'street_name': 'Cabrera Extensions',
                                   'street_number': 197,
                                   'zip_code': '81431'},
                    'affiliate_id': 12,
                    'brand': 'TTT',
                    'country': 'ZM',
                    'email': 'rosariojohn@TTT.zed',
                    'first_name': 'Peter',
                    'last_name': 'Green',
                    'leadsource': 559,
                    'password': 'test385',
                    'phone_number': '052839601'},)]

在我的情况下,我需要将所有这些数据都放到CSV文件中,所以通过csv模块,我尝试将所有这些数据写入CSV文件但我每次都收到 错误讯息:

ValueError: dict contains fields not in fieldnames: 'address' 

所以我添加到&#39;字段名称&#39;地址,但问题是我收到一列地址中的所有数据。

with open('test_file.csv', 'w') as csvfile:
    filed_names = ['first_name',
                   'last_name',
                   'email',
                   'phone_number',
                   'password',
                   'country',
                   'leadsource',
                   'affiliate_id',
                   'account_id',
                   'brand',
                   'street_number',
                   'street_name',
                   'city',
                   'state',
                   'address_country',
                   'zip_code',
                   ]
    writer = csv.DictWriter(csvfile, fieldnames=filed_names)
    writer.writeheader()
    writer.writerows(list_user_details)

2 个答案:

答案 0 :(得分:1)

你需要将结构展平,因此它只是一个包含字符串和数字的字典列表,而不是一个包含字符串和数字字典的字典列表。

假设您不想仅为编写步骤修改此列表,请创建一个新的空列表。将字典从一个列表复制到另一个列表,但将address字典转换为一组名为address.address_countryaddress.cityaddress.state的其他字段,依此类推。

然后使用csv写出这个新列表,并将修改后的字段名传递给它。

另外,不要忘记在字段字符串中使用逗号进行测试。

答案 1 :(得分:0)

Pandas提供了一个方便的选择:

# first flatten address
for d in lst:
    d.update(d['address'])
    del d['address']

# read into dataframe
df = pd.DataFrame(d, index=range(len(lst)))

# output to csv
df.to_csv('file.csv', index=False)

# Result
#   account_id address_country  affiliate_id brand               city country  \
# 0                         ZM            12   TTT  North Matthewland      ZM   

#                  email first_name last_name  leadsource password phone_number  \
# 0  rosariojohn@TTT.zed      Peter     Green         559  test385    052839601   

#     state         street_name  street_number zip_code  
# 0  Nevada  Cabrera Extensions            197    81431