我在python中有一个带有以下json格式的文件:
{"header":{"a":"1","b":"1"},
"data":[{"a":"1", "b":{"ba":"b1","bb":"b2","bc":"b3"}, "c":{"ca":"x1","cb":"x2","cc":"x3"}, "d":"4"},
{"a":"12", "b":{"ba":"12a","bb":"12ab","bc":"1ab"},"c":{"ca":"12z","cb":"12zz","cc":"12zzz"}, "d":"12"}
]}
我编写了一个没有嵌套'b'和'c'元素的csv解析器,但是在尝试将选定元素从'b'和'c'解析为我的csv时遇到了困难。这是我到目前为止所做的:
#load json
try:
with open('tmp.p', 'rb') as f:
myjson = json.load(f)
except IOError:
print("Error converting to json")
#write selected json to a csv output file
out = open(savedpath, 'a+')
try:
#add or remove data to parse here
mydata = ('d','b','a')
mycsv = csv.DictWriter(out, fieldnames=mydata, quoting=csv.QUOTE_ALL, extrasaction='ignore', lineterminator='\n')
mycsv.writeheader()
for row in myjson["data"]:
mycsv.writerow(row)
finally:
out.close()
我已将嵌套元素解析为单独的临时文件:
# parse nested elements ##
try:
#add or remove Port1/Port2 data to parse here
myport = ('bb','ba')
tmp3 = csv.DictWriter(t3, fieldnames=myport, quoting=csv.QUOTE_ALL, extrasaction='ignore', lineterminator='\n')
tmp3.writeheader()
tmp4 = csv.DictWriter(t4, fieldnames=myport, quoting=csv.QUOTE_ALL, extrasaction='ignore', lineterminator='\n')
tmp4.writeheader()
#print myjson["data"][0]["b"]["bb"]
#print myjson["data"][0]["c"]["bb"]
for row in myjson["data"]:
data1 = row["b"]
data2 = row["c"]
#print data1["bb"]
tmp3.writerow(data1)
tmp4.writerow(data2)
finally:
t3.close()
t4.close()
但是我在尝试加入数据时遇到了麻烦。我希望数据在我的csv中看起来像这样:
#header
a:1
b:1
#data
a,d,ba,bc,ca,cc
1,4,b1,b3,x1,x3
12,12,12a,1ab,12z,12zzz
我在尝试编写csv文件时遇到困难。我想我已经过度思考了这一点,但是因为我认为使用连接字符串可能会有效,但事实并非如此:
try:
with open('tmp3.p', 'rb') as port1:
with open('tmp4.p', 'rb') as port2:
with open('tmp5.p', 'rb') as general:
for rport1 in port1:
for rport2 in port2:
for rgen in general:
rport1 = str.replace(rport1,"\n","")
rport2 = str.replace(rport2,"\n","")
rgen = str.replace(rgen,"\n","")
string = ("%s,%s,%s" % (rgen, rport1, rport2))
print string
我使用了DictWriter,因为我需要按特定顺序解析文件。我知道在尝试合并数据时我正在打败使用json的目的,这是一个非常糟糕的做法,但我不知道如何继续。提前感谢您的帮助...
答案 0 :(得分:2)
我不是百分百肯定我明白你想要什么,但我想我可以从这个评论中猜到:
简化循环是麻烦的地方。用我现在的东西,第一个for循环用n个重复的第二个和第三个for循环迭代,依此类推......我不知道如何同步迭代每个文件并连接n行的字符串每个文件。
您想要的不是嵌套迭代,而是 lockstep 迭代。换句话说,您不希望第一个rport1
分别为rport2
,而第二个rport1
分别为rport2
,依此类推;您希望第一个rport1
只包含第一个rport2
,然后第二个rport1
只包含第二个rport2
,依此类推。
如果是这样,您正在寻找zip
。
我将通过一个精简的例子来说明差异:
>>> seq1 = [1, 2, 3]
>>> seq2 = [4, 5, 6]
>>>
>>> for i in seq1:
... for j in seq2:
... print i, j
1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6
>>>
>>> for i, j in zip(seq1, seq2):
... print i, j
1 4
2 5
3 6