2017-09-01 17 views
3

文字列を辞書に変換したいです。以前にこの辞書をテキストファイルに保存しました。Pythonは文字列を辞書に入れます

問題は今、私は確信していない、どのようにキーの構造です。値はCounter(dictionaryName)で生成されます。辞書は本当に大きいので、どのようにそれが可能になるかを見るためにすべてのキーをチェックすることはできません。

キーは、二重引用符」、コンマと、おそらく他のキャラクターのような単純な引用符を含めることができますので、辞書に戻ってそれを変換するすべての可能性がある、これはファイルに格納されているたとえば

:。?

Counter({'element0':512, "'4,5'element1":50, '4:55foobar':23,...}) 

Iは、例えば、JSONのために、以前の解決策を見つけましたが、私は二重引用符に問題があると私は単純にカンマために分割することはできません。

+2

私はあなたが達成しようとしていることを理解していません。 n正確に作業しています... **正確に**ファイルに保存されていますか?どのようにして "辞書を保存"しましたか?文字通り文字列表現をファイルに書き込んだのですか?それが最初の誤りでしょう。利用可能な多くのシリアライズフォーマットの1つを使用していたはずです。 –

+1

あなたはテキスト形式の辞書を持っていますか?それを辞書に変換したいのですか? –

+0

@Mohsen_Fatemiはいそれをテキストファイルに保存しました。辞書を手に入れるのに何時間もかかったので、ファイルに保存したかったのです。しかし、私は二重引用符などを含めることを期待していませんでした – Rust

答えて

3

あなたがソース、負荷from collections import Counterとを信頼する場合3210文字列

1

あなたは、その後であれば、基本的なPythonのデータ型を必要とするようast.literal_evalと休息を解析し、Counter()部分を削除できます。将来的には

import ast 

def parse_Counter_string(s): 
    s = s.strip() 
    if not (s.startswith('Counter(') and s.endswith(')')): 
     raise ValueError('String does not match expected format') 
    # Counter(is 8 characters 
    # 12345678 
    s = s[8:-1] 
    return Counter(ast.literal_eval(s)) 

を、私は別の道を選ぶお勧めしますデータをシリアル化します。

2

のようなものについてはどのように:あなたがこれを行うためにdemjsonライブラリを使用することができます

>> from collections import Counter 
>> line = '''Counter({'element0':512, "'4,5'element1":50, '4:55foobar':23})''' 
>> D = eval(line) 
>> D 
Counter({"'4,5'element1": 50, '4:55foobar': 23, 'element0': 512}) 
0

、あなたのプログラムの中で直接テキストを持つことができ

import demjson 

counter = demjson.decode("enter your text here") 

それがファイル内にある場合、あなたができます次の手順を実行してください:

WD = dirname(realpath(__file__)) 
file = open(WD, "filename"), "r") 
counter = demjson.decode(file.read()) 
file.close() 
関連する問題