【发布时间】:2018-12-08 06:46:41
【问题描述】:
我需要将 CSV 数据文件转换为 Python 中的嵌套 JSON 以用于应用程序。我的以下当前 Python 代码适用于 1 个客户/帐户文档,但不知何故无法为 CSV 文件中的所有客户创建 json 转储。
我在下面提供 Python 代码,它可以让您深入了解我想要实现的目标。如果有任何现有的解决方案,请告诉我。
示例 Python 代码:
import pandas as pd
from itertools import groupby
from collections import OrderedDict
import json
df = pd.read_csv('cust.csv', dtype={
"ClientID" : str,
"ClientName" : str,
"AcctID" : str,
"AcctNbr" : str,
"AcctTyp" : str
})
results = []
for (ClientID, ClientName), bag in df.groupby(["ClientID", "ClientName"]):
contents_df = bag.drop(["ClientID", "ClientName"], axis=1)
subset = [OrderedDict(row) for i,row in contents_df.iterrows()]
results.append(OrderedDict([("ClientID", ClientID),("ClientName", ClientName),("subset", subset)]))
print json.dumps(results[0], indent=4)
with open('ExpectedJsonFile.json', 'w') as outfile:
outfile.write(json.dumps(results[0], indent=4))
输入 CSV 示例:
ClientID,ClientName,AcctID,AcctNbr,AcctTyp
----------------------------------------------------------
00001,John George,812001,812001095,DDA
00001,John George,813002,813002096,SAV
00001,John George,814003,814003097,AFS
00024,Richard Polado,512987,512987085,ML
00024,Richard Polado,512983,512983086,IL
00345,John Cruze,1230,123001567,SAV
00345,John Cruze,5145,514502096,CD
00345,John Cruze,7890,7890033527,SGD
所需的输出 JSON:
{
"clientId":00001,
"ClientName":"John George",
"subset":[
{
"AcctID":812001,
"AcctNbr":"812001095",
"AcctTyp":"DDA",
},
{
"AcctID":813002,
"AcctNbr":"813002096",
"AcctTyp":"SAV",
},
{
"AcctID":814003,
"AcctNbr":"814003097",
"AcctTyp":"AFS",
}
]
},
{
"clientId":00024,
"ClientName":"Richard Polado",
"subset":[
{
"AcctID":512987,
"AcctNbr":"512987085",
"AcctTyp":"ML",
},
{
"AcctID":512983,
"AcctNbr":"512983086",
"AcctTyp":"IL",
}
]
}
这些文档应该继续为其他成千上万的客户创建。
【问题讨论】:
-
你所说的“不知何故不能”是什么意思 - 你具体有什么问题?它不做什么?
-
它只为第一个 ClientID 创建一个文档。 { "clientId":00001, "ClientName":"John George", "subset":[ { "AcctID":812001, "AcctNbr":"812001095", "AcctTyp":"DDA", }, { "AcctID" :813002,“AcctNbr”:“813002096”,“AcctTyp”:“SAV”,},{“AcctID”:814003,“AcctNbr”:“814003097”,“AcctTyp”:“AFS”,}]}
-
听起来像是调试问题。编写一些代码来检测它是否在循环的第二遍到达文件写入部分。它没有到达那里吗?或者,也许您的文件写入失败,因为它使用了相同的文件名?
-
我不熟悉Python,但是循环不需要缩进吗?在这种情况下,您似乎没有。
-
@ShivKumar 我的解决方案有效吗?