Bạn có thể sử dụng eval
built-in. Ví dụ, điều này sẽ có tác dụng nếu mỗi mục từ điển là trên một dòng khác nhau:
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
Ngoài ra, nếu các tập tin chỉ là một từ điển lớn (thậm chí trên nhiều dòng), bạn có thể làm điều này:
with open('myfile.txt','r') as inf:
dict_from_file = eval(inf.read())
Đây có lẽ là cách đơn giản nhất để thực hiện, nhưng không phải là cách an toàn nhất. Như những người khác được đề cập trong câu trả lời của họ, eval
có một số rủi ro bảo mật vốn có. Cách thay thế, như đã đề cập bởi JBernardo, là sử dụng ast.literal_eval
an toàn hơn nhiều so với eval vì nó sẽ chỉ đánh giá các chuỗi có chứa các chữ. Bạn chỉ có thể thay thế tất cả các cuộc gọi thành eval
trong các ví dụ trên với ast.literal_eval
sau khi nhập mô-đun ast
.
Nếu bạn đang sử dụng Python 2.4, bạn sẽ không có mô-đun ast
và bạn sẽ không có các tuyên bố with
. Mã sẽ trông giống như sau:
inf = open('myfile.txt','r')
dict_from_file = eval(inf.read())
inf.close()
Đừng quên gọi inf.close()
. Vẻ đẹp của tuyên bố with
là chúng làm điều đó cho bạn, ngay cả khi khối mã trong câu lệnh with
làm tăng ngoại lệ.
Nguồn
2012-02-16 16:19:26
'ast.literal_eval' – JBernardo
@JBernardo 1 như miễn là bạn có Python 2.6 hoặc mới hơn, đó là cách để đi. Mô-đun 'ast' được giới thiệu trong 2.5, nhưng không có các hàm trợ giúp (chẳng hạn như' literal_eval'). Những người đến trong 2,6. –
@JBernardo, câu trả lời hay nhất – dzhioev