4

コレクションをインポートしてPython順序付き辞書を作成し、「filename.txt」という名前のファイルに保存しました。ファイルの内容は次のようになります

OrderedDict([(7, 0), (6, 1), (5, 2), (4, 3)])

この OrderedDict を別のプログラムから利用する必要があります。私はそれをする

myfile = open('filename.txt','r')
mydict = myfile.read()

タイプとして「mydict」を取得する必要があります

<class 'collections.OrderedDict'>

しかし、ここでは「str」型であることがわかります。
Python で文字列型を OrderedDict 型に変換する方法はありますか? Python 2.7を使用

4

4 に答える 4

7

ピクルスで保存してロードできます

import cPickle as pickle

# store:
with open("filename.pickle", "w") as fp:
    pickle.dump(ordered_dict, fp)

# read:
with open("filename.pickle") as fp:
    ordered_dict = pickle.load(fp)

type(ordered_dict) # <class 'collections.OrderedDict'>
于 2012-05-08T12:44:51.797 に答える
6

ここでの最善の解決策は、データを別の方法で保存することです。たとえば、JSON にエンコードします。

他の回答で説明されているようにモジュールを使用するpickleこともできますが、これには潜在的なセキュリティ上の問題があります (eval()以下で説明するように)。データが常に信頼されることがわかっている場合にのみ、このソリューションを使用してください。

データの形式を変更できない場合は、他の解決策があります。

本当に悪い解決策は、これを行うために使用eval()することです。ファイルに入れられたコードは他の理由とともに実行されるため、安全ではないため、これ本当に悪い考えです。

より良い解決策は、ファイルを手動で解析することです。利点は、これをごまかす方法があり、もう少し簡単にできることです。Python にはast.literal_eval()、リテラルを簡単に解析できる機能があります。これは OrderedDict を使用するためリテラルではありませんが、リスト リテラルを抽出して解析できます。

例: (未テスト)

import re
import ast
import collections

with open(filename.txt) as file:
    line = next(file)
    values = re.search(r"OrderedDict\((.*)\)", line).group(1)
    mydict = collections.OrderedDict(ast.literal_eval(values))
于 2012-05-08T12:47:00.173 に答える
0

これがPython 2.7での方法です

from collections import OrderedDict
from ast import literal_eval

# Read in string from text file
myfile = open('filename.txt','r')
file_str = myfile.read()

# Remove ordered dict syntax from string by indexing
file_str=file_str[13:]
file_str=file_str[:-2]

# convert string to list
file_list=literal_eval(file_str)

header=OrderedDict()
for entry in file_list:
    # Extract key and value from each tuple
    key, value=entry
    # Create entry in OrderedDict
    header[key]=value

繰り返しますが、おそらくテキスト ファイルを別の方法で記述する必要があります。

于 2016-08-23T17:32:22.203 に答える