2017-02-28 2 views
0

私はjsonに出力するための列をExcelで取得して辞書に入れる関数を書いています。 json出力を書き出すと、キー値はランダムに並べ替えられているように見えます。キー値を追加する順番になるようにキー値を適用する方法はありますか?辞書項目をランダムに注文するのを避けるには?

def excel_to_json(filename): 
    wb = xlrd.open_workbook(filename) 
    sh = wb.sheet_by_index(0) 

    # List to hold dictionaries 
    c_list = [] 

    # Iterate through each row in worksheet and fetch values into dict 
    for rownum in range(1, sh.nrows): 
     cars = OrderedDict() 
     row_values = sh.row_values(rownum) 
     cars['Name'] = row_values[0] 
     cars['Extensions'] = row_values[1] 
     cars['Patterns'] = row_values[2] 
     cars['RansomNoteFilenames'] = row_values[3] 
     cars['Comment'] = row_values[4] 
     cars['EncryptionAlgorithm'] = row_values[5] 
     cars['AlternateNames'] = row_values[6] 
     cars['Decryptor'] = row_values[7] 
     cars['AdditionalInfo1'] = row_values[8] 
     cars['AdditionalInfo2'] = row_values[9] 
     cars['Screenshots'] = row_values[10] 

     c_list.append(cars) 

    # Serialize the list of dicts to JSON 
    return formatJson(json.dumps(c_list)) 


def formatJson(input): 
    return json.dumps(json.loads(input), indent=4) 

例JSONの出力は次のようになります。

{ 
     "Name": "dummydata", 
     "Comment": "", 
     "AlternateNames": "", 
     "Screenshots": "dummydata", 
     "RansomNoteFilenames": "dummydata", 
     "Decryptor": "", 
     "Extensions": "dummydata", 
     "AdditionalInfo2": "", 
     "Patterns": "", 
     "EncryptionAlgorithm": "dummydata", 
     "AdditionalInfo1": "dummydata", 
    }, 

あなたはここにキーが処理された場合は、JSONの可読性を困難にexcel_to_json()内のループのために異なる順序である見ることができるように手動で

+1

columns = ['Name', 'Extension', 'Patterns'] row = ['Foo', 'Bar', 'Baz'] OrderedDict(zip(columns, row)) 

ができます。なぜあなたは再びjsonに変換していますか? – AKS

+2

あなたのformatJson関数では、もう一度(dictへの文字列)ロードすると問題を引き起こします。 –

+0

ooops -deleting .... – knitti

答えて

1

この

def formatJson(inp): 
    return json.dumps(inp, indent=4) 

を行うと、あなたは余分な時間をダンプし、再びそれをロードしている

formatJson(c_list) 

のようにそれを呼び出します。

また、あなたのコードに若干の改善

for rownum in range(1, sh.nrows): 
     cars = OrderedDict() 
     row_values = sh.row_values(rownum) 
     row_names = ['Name','Extensions','Patterns','Comment',....] 
     for i in range(len(row_values)): 
      cars[row_names[i]] = row_values[i] 

     c_list.append(cars) 
1

これは、使用jsonシリアライザは、実際にOrderedDict以内に注文を尊重するかどうかによって異なります。別の方法(たとえばsimplejson)を試して、効果があるかどうか確認できます。それらはすべてAPI互換です。

また、ほとんどのjson.dumpsの実装では、すべてのキーをアルファベット順に並べ替えるパラメータsort_keysがあります。これは、データの表現がで安定しているようにする場合に便利です。

p.s.

zipビルトインを使用すると、コードをもっと簡単にすることができます。あなたは既に `OrderedDict`を使用している

OrderedDict([('Name', 'Foo'), ('Extension', 'Bar'), ('Patterns', 'Baz')]) 
関連する問題