将所有值写入一行csv.DictWriter

时间:2019-02-18 12:23:39

标签: python csv dictionary

我无法从从Leadfeeder API获取的某些数据中生成格式正确的CSV文件。在当前正在创建的csv文件中,并非所有值都在一行中,id和Leads比其他值高一列。就像这里:

CSV Output

我后来还喜欢加载另一个json文件,并使用它在id上映射一些值,然后将每条线索的访问量也放入我的csv文件中。

您对此有何建议?

到目前为止,这是我的代码:

import json
import csv

csv_columns = ['name', 'industry', 'website_url', 'status', 'crm_lead_id', 'crm_organization_id', 'employee_count', 'id', 'type' ]

with open('data.json', 'r') as d:    
    d = json.load(d)

csv_file = 'lead_daten.csv'

try:
    with open('leads.csv', 'w', newline='') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns, extrasaction='ignore')
        writer.writeheader()
        for item in d['data']:
            writer.writerow(item)
            writer.writerow(item['attributes'])

except IOError:
    print("I/O error")

我的json数据具有以下结构: 我还需要一些嵌套值,例如关系中的id!

{
    "data": [
        {
            "attributes": {
                "crm_lead_id": null, 
                "crm_organization_id": null, 
                "employee_count": 5000, 
                "facebook_url": null, 
                "first_visit_date": "2019-01-31", 
                "industry": "Furniture", 
                "last_visit_date": "2019-01-31", 
                "linkedin_url": null, 
                "name": "Example Inc", 
                "phone": null, 
                "status": "new", 
                "twitter_handle": "example", 
                "website_url": "http://www.example.com"
            }, 
            "id": "s7ybF6VxqhQqVM1m1BCnZT_8SRo9XnuoxSUP5ChvERZS9", 
            "relationships": {
                "location": {
                    "data": {
                        "id": "8SRo9XnuoxSUP5ChvERZS9", 
                        "type": "locations"
                    }
                }
            }, 
            "type": "leads"
        }, 
        {
            "attributes": {
                "crm_lead_id": null, 

1 个答案:

答案 0 :(得分:0)

写入csv时,必须一次写入一整行。您当前的代码只用id和type写入一行,然后用其他字段写入另一行。

正确的方法是首先完全构建一个包含所有字段的字典,然后再执行一次操作。代码可能是:

    ...
    writer.writeheader()
    for item in d['data']:
        item.update(item["attributes"])
        writer.writerow(item)
    ...