1

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を使用する目的を破っていることは知っていますが、それは本当に悪い習慣ですが、どうすればよいかわかりません。助けてくれてありがとう...

4

1 に答える 1

2

あなたが何を望んでいるかを100%理解しているとは言えませんが、このコメントから推測できると思います:

ループの単純化が問題です。私が今持っているものでは、最初の for ループは n 回の反復的な 2 番目と 3 番目の for ループなどで反復されます...各ファイルを同期的に反復し、n 行から文字列を連結する方法がわかりません各ファイルの。

必要なのは、ネストされた反復ではなく、ロックステップ反復です。言い換えれば、最初のrport1which each rport2、次に each の 2 番目、rport1というようrport2にはしたくないということです。最初のものはfirstrport1だけでrport2、次に 2 番目のrport1ものは second だけで、という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
于 2013-10-14T21:47:39.990 に答える