为了账号安全,请及时绑定邮箱和手机立即绑定

如何将JSON转换为CSV?

如何将JSON转换为CSV?

四季花海 2019-06-17 15:32:49
如何将JSON转换为CSV?我有一个JSON文件,我想要隐藏到一个CSV文件。我怎样才能用Python做到这一点呢?我试过:import jsonimport csv f = open('data.json')data = json.load(f)f.close()f = open('data.csv')csv_file = csv.writer(f)for item in data:     f.writerow(item)f.close()但是,这是行不通的。我正在使用Django,收到的错误是:file' object has no attribute 'writerow'于是,我尝试了以下几点:import jsonimport csv f = open('data.json')data = json.load(f)f.close()f = open('data.csv')csv_file = csv.writer(f)for item in data:     csv_file.writerow(item)f.close()然后我得到错误:sequence expected示例JSON文件:[   {     "pk": 22,     "model": "auth.permission",     "fields": {       "codename": "add_logentry",       "name": "Can add log entry",       "content_type": 8     }   },   {     "pk": 23,     "model": "auth.permission",     "fields": {       "codename": "change_logentry",       "name": "Can change log entry",       "content_type": 8     }   },   {     "pk": 24,     "model": "auth.permission",     "fields": {       "codename": "delete_logentry",       "name": "Can delete log entry",       "content_type": 8     }   },   {     "pk": 4,     "model": "auth.permission",     "fields": {       "codename": "add_group",       "name": "Can add group",       "content_type": 2     }   },   {     "pk": 10,     "model": "auth.permission",     "fields": {       "codename": "add_message",       "name": "Can add message",       "content_type": 4     }   }]
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我假设您的JSON文件将解码为字典列表。首先,我们需要一个将JSON对象扁平化的函数:

def flattenjson( b, delim ):
    val = {}
    for i in b.keys():
        if isinstance( b[i], dict ):
            get = flattenjson( b[i], delim )
            for j in get.keys():
                val[ i + delim + j ] = get[j]
        else:
            val[i] = b[i]

    return val

在JSON对象上运行此片段的结果:

flattenjson( {
    "pk": 22, 
    "model": "auth.permission", 
    "fields": {
      "codename": "add_message", 
      "name": "Can add message", 
      "content_type": 8
    }
  }, "__" )

{
    "pk": 22, 
    "model": "auth.permission', 
    "fields__codename": "add_message", 
    "fields__name": "Can add message", 
    "fields__content_type": 8
}

将此函数应用于JSON对象的输入数组中的每个dict之后:

input = map( lambda x: flattenjson( x, "__" ), input )

并找到相关的列名:

columns = [ x for row in input for x in row.keys() ]columns = list( set( columns ) )

在CSV模块中运行这一点并不难:

with open( fname, 'wb' ) as out_file:
    csv_w = csv.writer( out_file )
    csv_w.writerow( columns )

    for i_r in input:
        csv_w.writerow( map( lambda x: i_r.get( x, "" ), columns ) )

我希望这能帮到你!


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 1449 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信