【问题标题】:Convert JSON to CSV将 JSON 转换为 CSV
【发布时间】:2011-04-27 22:36:07
【问题描述】:

在 python 中,我有一个由列表和字典组成的复杂对象层次结构。我想将其全部吐出为 CSV 或其他某种数据库格式。非常感谢任何 Python 或 Javascript 的答案。

我了解一个 CSV 文件(或表)只能代表我的层次结构中的一个“级别”对象,因此解决方案需要创建多个文件。

这是一个例子:

{
    "Person" : [{"name":"Greg","age":"35","car":["honda civic","ford focus"]},
                {"name":"Steve","age":"28", "car":["mazda 323", "toyota camry"]}]
}

会变成

Person.csv:
id,name,age
1,Greg,35
2,Steve,28

car.csv:
id,Person_id,value
1,1,honda civic
2,1,ford focus
3,2,mazda 323
4,2,toyota camry

基本上,这里唯一有趣的事情是分配新的 ID,以便可以关联表中的行。

干杯, 戴夫

【问题讨论】:

    标签: python json csv


    【解决方案1】:

    试试这样的。

    json_dict = {
        "Person" : [{"name":"Greg","age":"35","car":["honda civic","ford focus"]},
                    {"name":"Steve","age":"28", "car":["mazda 323", "toyota camry"]}]
    }
    
    for entity in json_dict:
        csv_file = open('%s.csv' % entity, 'wb')
        headers = a[entity][0].keys()
        csv_writer = csv.DictWriter(csv_file, headers)
        map(csv_writer.writerow, json_dict[entity])
        csv_file.close()
    

    # 现在你有了 json 到 csv 文件的格式,你可以使用 awk;

    awk  -F , '{print NR ", " $2 ", " $3 }' Person.csv > person.csv
    

    ...

    【讨论】:

      【解决方案2】:

      分配新的 id 以便可以关联表中的行。

      如:

      1. 为每一行创建一个主键 (PK)。

      2. 在 Car 和 Person 之间创建外键 (FK) 关系。看来 Car 对 Person 有“依赖”关系。

      第 1 步。在您的 JSON 对象上使用 enumerate。这将为每个人提供一个方便的 PK。

      第 2 步。为每个人使用方便的 PK 作为您创建的每辆汽车的 FK。

      唯一不愉快的是将 PK 分配给 Cars,因为没有方便的方法在您的特定数据结构上使用 enumerate。为此,您必须使用一个好的旧计数器。

      http://docs.python.org/library/functions.html#enumerate

      【讨论】:

        【解决方案3】:
        import json
        import csv
        temp = json.load(open('filename.json','r'))
        output =[]
        for each in temp:
             row = {}
             row['field1'] =each['field1']
             row['field2'] = each['field2']
             output.append(row)
        file = open( "filename_destination.csv", "w")
        
        fileWriter = csv.writer(file , delimiter=",",quotechar='"', quoting=csv.QUOTE_MINIMAL)
        
        Header = ['field1','field2']
        
        fileWriter.writerow(Header)
        
        for x in output:
        te = [x['field1'],x['field2']]
        fileWriter.writerow(te)
        file.close()
        

        【讨论】:

          【解决方案4】:

          我刚刚发布了一个在 Node.js 中简化此过程的模块

          var jsonexport = require('jsonexport');
          
          var contacts = [{
             name: 'Bob',
             lastname: 'Smith',
             family: {
                 name: 'Peter',
                 type: 'Father'
             }
          },{
             name: 'James',
             lastname: 'David',
             family:{
                 name: 'Julie',
                 type: 'Mother'
             }
          },{
             name: 'Robert',
             lastname: 'Miller',
             family: null,
             location: [1231,3214,4214]
          },{
             name: 'David',
             lastname: 'Martin',
             nickname: 'dmartin'
          }];
          
          jsonexport(contacts,function(err, csv){
              if(err) return console.log(err);
              console.log(csv);
          });
          

          https://www.npmjs.com/package/jsonexport

          【讨论】:

            猜你喜欢
            • 2015-08-23
            • 2019-08-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多