Można użyć eval
wbudowane. Na przykład, będzie to działać, jeśli każdy wpis słownik jest na innej linii:
with open('myfile.txt','r') as inf:
dict_from_file = eval(inf.read())
:
dicts_from_file = []
with open('myfile.txt','r') as inf:
for line in inf:
dicts_from_file.append(eval(line))
# dicts_from_file now contains the dictionaries created from the text file
Alternatywnie, jeśli plik jest po prostu jednym wielkim słowniku (nawet na wielu liniach), można to zrobić
Jest to prawdopodobnie najprostszy sposób na zrobienie tego, ale nie jest najbezpieczniejszy. Jak wspomnieli inni w swoich odpowiedziach, eval
ma pewne nieodłączne ryzyko bezpieczeństwa. Alternatywą, jak wspomniał JBernardo, jest użycie ast.literal_eval
, która jest o wiele bezpieczniejsza niż eval, ponieważ będzie tylko oceniać ciągi zawierające literały. Możesz po prostu wymienić wszystkie połączenia na eval
w powyższych przykładach za pomocą ast.literal_eval
po zaimportowaniu modułu ast
.
Jeśli używasz Pythona 2.4, nie będziesz mieć modułu ast
i nie będziesz mieć instrukcji with
. Kod będzie wyglądać mniej więcej tak:
inf = open('myfile.txt','r')
dict_from_file = eval(inf.read())
inf.close()
Nie zapomnij zadzwonić pod numer inf.close()
. Piękno instrukcji with
jest to, że robią to za Ciebie, nawet jeśli blok kodu w instrukcji with
podnosi wyjątek.
'ast.literal_eval' – JBernardo
@JBernardo +1 jako tak długo, jak masz Python 2.6 lub nowszy, w ten sposób możesz iść. Moduł 'ast' został wprowadzony w wersji 2.5, ale nie miał funkcji pomocniczych (takich jak' literal_eval'). Te pojawiły się w wersji 2.6. –
@JBernardo, najlepsza odpowiedź – dzhioev