如何将JSON转换为CSV?
如何将JSON转换为CSV?
我有一个JSON文件,我想将其转换为CSV文件。我该如何用Python实现这个功能?\n我尝试了以下代码:\n
import json import 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()
\n然而,它没有起作用。我正在使用Django,我收到的错误是:\n`file\' object has no attribute \'writerow\'`\n然后,我尝试了以下代码:\n
import json import 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()
\n然后我得到了错误:\n`sequence expected`\n样本JSON文件:\n[{\n \"pk\": 22,\n \"model\": \"auth.permission\",\n \"fields\": {\n \"codename\": \"add_logentry\",\n \"name\": \"Can add log entry\",\n \"content_type\": 8\n }\n }, {\n \"pk\": 23,\n \"model\": \"auth.permission\",\n \"fields\": {\n \"codename\": \"change_logentry\",\n \"name\": \"Can change log entry\",\n \"content_type\": 8\n }\n }, {\n \"pk\": 24,\n \"model\": \"auth.permission\",\n \"fields\": {\n \"codename\": \"delete_logentry\",\n \"name\": \"Can delete log entry\",\n \"content_type\": 8\n }\n }, {\n \"pk\": 4,\n \"model\": \"auth.permission\",\n \"fields\": {\n \"codename\": \"add_group\",\n \"name\": \"Can add group\",\n \"content_type\": 2\n }\n }, {\n \"pk\": 10,\n \"model\": \"auth.permission\",\n \"fields\": {\n \"codename\": \"add_message\",\n \"name\": \"Can add message\",\n \"content_type\": 4\n }\n }\n]\n
如何将JSON转换为CSV?
问题的出现原因:
需要将JSON文件转换为CSV文件,以便于进行数据分析和处理。
解决方法:
首先,我们需要一个函数来将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对象的每个字典,并找到相关的列名。代码如下:
input = map(lambda x: flattenjson(x, "__"), input) columns = [x for row in input for x in row.keys()] columns = list(set(columns))
最后,我们可以使用csv模块将结果写入CSV文件。代码如下:
import 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))
通过以上步骤,我们可以将JSON文件成功转换为CSV文件,方便后续的数据处理和分析。
如何将JSON转换为CSV?
首先,你的JSON中有嵌套对象,所以通常不能直接转换为CSV。你需要将其改为类似以下内容的格式:
{
"pk": 22,
"model": "auth.permission",
"codename": "add_logentry",
"content_type": 8,
"name": "Can add log entry"
},
......
以下是我用于从JSON生成CSV的代码:
import csv import json x = """[ { "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 } } ]""" x = json.loads(x) f = csv.writer(open("test.csv", "wb+")) # 写入CSV头部,如果不需要,可以删除这一行 f.writerow(["pk", "model", "codename", "name", "content_type"]) for x in x: f.writerow([ x["pk"], x["model"], x["fields"]["codename"], x["fields"]["name"], x["fields"]["content_type"] ])
你将得到以下输出:
pk,model,codename,name,content_type 22,auth.permission,add_logentry,Can add log entry,8 23,auth.permission,change_logentry,Can change log entry,8 24,auth.permission,delete_logentry,Can delete log entry,8
如果使用Python3,请参考这个链接:stackoverflow.com/questions/7200606。
对于Python3,请将打开CSV文件的那一行改为f = csv.writer(open("test.csv", "w", newline=''))
。
TypeError: a bytes-like object is required, not 'str'
是关于Python3中的编码类型错误。尝试使用f.writer(open('test.csv', 'w', encoding='utf8'))
。
如何将JSON转换为CSV?
通过使用pandas库,这非常简单,只需使用两个命令!
df = pd.read_json()
read_json将JSON字符串转换为pandas对象(系列或数据帧)。然后:
df.to_csv()
可以返回一个字符串或直接写入csv文件。有关to_csv的详细信息,请参阅文档。
基于以前答案的冗长性,我们都应该感谢pandas提供的快捷方式。
对于非结构化的JSON,请参考此答案。
编辑:
有人要求提供一个有效的最小示例:
import pandas as pd
with open('jsonfile.json', encoding='utf-8') as inputfile:
df = pd.read_json(inputfile)
df.to_csv('csvfile.csv', encoding='utf-8', index=False)
这也可以作为最小的一行代码完成:curl url | python -c 'import sys,pandas as pd;pd.read_json(sys.stdin).to_csv(sys.stdout)'