2016-09-18 4 views
0

でcsv.DictWriterによって作成された括弧の削除:私は形式でグラフを表す辞書を保存していたときのpython

graph_dict = {'b': ['a', 'c'], 'a': [], 'c': ['a'], 'd': []} 

とcsv.DictWriterでそれを保存し、私が手にそれをロードします。

loaded_graph ={'b': "['a', 'c']", 'c': "['a']", 'a': '[]', 'd': '[]'} 

値リストの引用符を追加しないでください。ファイルを読み込むときに値リストを削除するには、どのようなコードを使用する必要がありますか?助けていただければ幸いです!エディタで開か

print(graph_dict) 

with open('graph.csv', 'w') as csvfile: 

    graph = ['vertices', 'edges'] 
    writer = csv.DictWriter(csvfile, fieldnames=graph) 

    writer.writeheader() 

    for vertex in graph_dict: 
     edges = graph_dict[vertex] 

     writer.writerow({'vertices': vertex, 'edges': edges}) 


print("reading") 

loaded_graph = {} 

with open('graph.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
     loaded_graph[row['vertices']] = row['edges'] 

print(loaded_graph) 

csvファイルは次のようになります。

vertices,edges 
b,"['a', 'c']" 
a,[] 
c,['a'] 
d,[] 
+1

かっこ?引用符/引用符を意味しますか? CSVはネストされたデータ構造の適切なフォーマットではないので、間違ったツリーをすでに作り上げています。 – ShadowRanger

+0

[CSVの代わりにJSON](http://stackoverflow.com/questions/17043860/python-dump-dict-to-json-file)を使用してください。 CSVは、任意のネストされたデータではなく、フラットな表形式のデータ形式用に設計されています。あなたが達成しようとしている効果のための適切なツールを使用してください。 –

答えて

0

は、あなたがこのファイルにリストを書き込み、その後

edges = graph_dict[vertex] 
    writer.writerow({'vertices': vertex, 'edges': edges}) 

graph_dict = {'b': ['a', 'c'], 'a': [], 'c': ['a'], 'd': []} 

を持っています - それはstrに変換されます。

の髪型、例えば

writer.writerow({'vertices': vertex, 'edges': ','.join(edges)}) 
+0

これは、問題をマスキングしているだけです。なぜなら、実際のCSV内のCSVが不良であるかどうかを手動で読み取るときに、手作業でそれを解析しているからです。 – ShadowRanger

0

CSVは、ネストされたデータ構造のためのものではありません。出力にはlistの値がstrに変換されています。

より適切な形式(JSONまたはpickleなど)を使用するか、恐ろしいハッキングを使用して値のreprを元の値に戻す必要があります。 ast.literal_eval(ただし、元の値の一部が文字列であると思われる場合は正しく動作しません)。

0

このデータをCSVで「シリアル化」しようとしていますが、これはPython以外のファイルを分析する場合に適しています。そうでない場合は、pickleモジュールで問題を簡単に解決できます。

CSVを使用する必要がある場合は、ファイルの「エッジ」として保存する値がすべて文字列であることを確認してください。その後、ファイルから読み込んだら、リストに戻してください。

import csv 

graph_dict = {'b': ['a', 'c'], 'a': [], 'c': ['a'], 'd': []} 

file_path = 'graph.csv' 

with open(file_path, 'w', newline='') as outfile: 
    fieldnames = ['vertices', 'edges'] 
    writer = csv.DictWriter(outfile, fieldnames=fieldnames) 
    writer.writeheader() 

    for vertex, edges in graph_dict.items(): 
     # Save multiples as "x,y,z" 
     edges = ','.join(edges) 
     row = {'vertices': vertex, 'edges': edges} 
     writer.writerow(row) 

loaded_graph = {} 
with open(file_path, 'r', newline='') as infile: 
    reader = csv.DictReader(infile) 
    for row in reader: 
     edges = row['edges'] 
     # Read empty as [], full as ['x', 'y', 'z'] 
     edges = edges.split(',') if edges else [] 
     loaded_graph[row['vertices']] = edges 

これは、要求通りに{'a': [], 'b': ['a', 'c'], 'c': ['a'], 'd': []}を与えます。

+1

ありがとう!私はそれを経験していないので、ピクルスとジョソンのヒントのおかげで。 Basicaly私はちょうどそれに取り組んだ後にデータを保存し、次の時間を開始するときに保存されたデータを呼び出すことを探していた。さらに、私はcsv(および他のもの)を使用するgephiでデータを視覚化したいと思っています。しかし、私はそれを見て私は、私の問題が解決されるようにjsonの輸入業者があることがわかった。ありがとう! –

関連する問題