2016-04-05 9 views
1

からJSONブロックされて作成します私のコード:this.HereからJSONファイルを作成したい入力テキストfile.Iに上記ブロックの数に制限はありません、私は</p> <pre><code>A : abc B : crs C : rds D : fgh A: wer B : tyu C : uio D : dfg </code></pre> <p>以下のようなテキストファイルを持っているテキストファイル

import json 
with open("<input file path>") as fd: # open file 
    d = dict(line.split(":", 1) for line in fd) # create dict of it 
print json.dumps(d) # print dict in json format 

はこれが仕事をしていないが、そのいくつかの最初の行を省略し、他の

+0

コードはどこにありますか? –

+0

テストデータには、すべてのキーが2回あります。あなたが2回目に辞書にキーを追加すると、それは古いキーを上書きします。 JSONが実際にどのように実際に見えるかを考えなければなりません。多分辞書のリスト。 –

+0

彼の.txtファイルには多くのJSONオブジェクトがあるので、キーが繰り返されると思います。 – BNilsou

答えて

0

あなたのファイルの下に別々のブロックを1つずつ印刷していないが、非一意キーを持っています。 Python's json module only supports JSON object decoding with duplicate keysに注意してください。標準エンコーダーを使用して重複キーでJSONオブジェクトをエンコードすることはできません。

さらに、中間データストレージとしてP​​ythonのdictクラスを使用しています。したがって、dictはアイテムの注文を維持しないため、データエントリの注文が失われています。 OrderedDictクラスはアイテムの順序を維持しますが、重複キーは許可されないため、オプションでもありません。

PyPIでオブジェクトの重複したキーエンコーディングをサポートするJSONパッケージが見つからない場合は、おそらく独自のJSONエンコーダを作成する必要があります。

ので、得られた溶液は次のようになります。重複キーをサポートし、項目の順序を維持し、あなたのファイルの内容を保存するために

  1. カスタムクラス。基本的には、キーと値のペアのリストに対するクラスラッパー(JSONEncoderがデータをリストとして扱わないようにするためにクラスラッパーが必要です)。
  2. JSONEncoderから継承し、defaultメソッドをオーバーライドし、カスタムデータクラスのインスタンス用に独自のカスタム変換を定義します。どのように行うのの詳細についてはPython Docsを参照してください:

To extend this to recognize other objects, subclass and implement a default() method with another method that returns a serializable object for o if possible, otherwise it should call the superclass implementation (to raise TypeError).

0

私はこのようにコードを変更:

import json 
result = [] # Result will be a list of dictionaries 
with open("data.txt") as fd: 
    d = dict() # Start the first dictionary 
    for line in fd: 
     line = line.strip() 
     if d and line == '': 
      # Start a new block/dictionary on empty lines 
      result.append(d) 
      d = dict() 
      continue 
     k, v = line.split(":", 1) 
     d[k.strip()] = v.strip() 
if d: 
    # Add any remaining results 
    result.append(d) 
print json.dumps(result, indent=2) # Print parsed results as json 

を私が正しくあなたを理解していれば、次の出力は何をしたいです:

[ 
    { 
    "A": "abc", 
    "C": "rds", 
    "B": "crs", 
    "D": "fgh" 
    }, 
    { 
    "A": "wer", 
    "C": "uio", 
    "B": "tyu", 
    "D": "dfg" 
    } 
] 
+0

パーフェクト。どうもありがとう – Trishal

関連する問題

 関連する問題