字典有由鍵值對組成,有key和value,大概長這樣:
{'001' : 'a', '002' : 'b', '003 ': 'c'}
如果想把內存中的字典存儲為文本文件,文本文件dict.txt
的一種形式可以是這樣:
001 a 002 b 003 c
字典轉文本文件
# 先創建並打開一個文本文件 file = open('dict.txt', 'w') # 遍歷字典的元素,將每項元素的key和value分拆組成字符串,注意添加分隔符和換行符 for k,v in dict_temp.items(): file.write(str(k)+' '+str(v)+'\n') # 注意關閉文件 file.close() # 字典輸出的項是無序的,如果想按照字典的key排序輸出的話,可以按照下面的方式實現 # for k,v in sorted(dict_temp.items()): # file.write(str(k)+' '+str(v)+'\n') # file.close()
文本文件轉字典
# 聲明一個空字典,來保存文本文件數據 dict_temp = {} # 打開文本文件 file = open('dict.txt','r') # 遍歷文本文件的每一行,strip可以移除字符串頭尾指定的字符(默認為空格或換行符)或字符序列 for line in file.readlines(): line = line.strip() k = line.split(' ')[0] v = line.split(' ')[1] dict_temp[k] = v # 依舊是關閉文件 f.close() # 可以打印出來瞅瞅 print(dict_temp)
文本字典轉字典
user_info = '{"name" : "john", "gender" : "male", "age": 28}'
轉換效果:
user_dict = {"name" : "john", "gender" : "male", "age": 28}
有以下幾種方法:
1、通過 json 來轉換
import json user_info= '{"name" : "john", "gender" : "male", "age": 28}' user_dict = json.loads(user_info)
user_dict {u'gender': u'male', u'age': 28, u'name': u'john'}
但是使用 json
進行轉換存在一個潛在的問題。 由於 json
語法規定 數組或對象之中的字符串必須使用雙引號,不能使用單引號
2、通過 eval
user_info = '{"name" : "john", "gender" : "male", "age": 28}' user_dict = eval(user_info)
user_dict {'gender': 'male', 'age': 28, 'name': 'john'}
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}" user_dict = eval(user_info)
user_dict {'gender': 'male', 'age': 28, 'name': 'john'}
通過 eval
進行轉換就不存在上面使用 json
進行轉換的問題。但是,使用 eval
卻存在安全性的問題
,比如下面的例子:
# 讓用戶輸入 `user_info` user_info = raw_input('input user info: ') # 輸入 {"name" : "john", "gender" : "male", "age": 28},沒問題 user_dict = eval(user_info) # 輸入 __import__('os').system('dir'),user_dict 會列出當前的目錄文件! # 再輸入一些刪除命令,則可以把整個目錄清空了! user_dict = eval(user_info)
3、通過 literal_eval
import ast user = '{"name" : "john", "gender" : "male", "age": 28}' user_dict = ast.literal_eval(user) user_dict {'gender': 'male', 'age': 28, 'name': 'john'} user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}" user_dict = ast.literal_eval(user_info)
user_dict
{'name': 'john', 'gender': "male", 'age': '28'}
使用 ast.literal_eval
進行轉換既不存在使用 json
進行轉換的問題,也不存在使用 eval
進行轉換的 安全性問題
,因此推薦使用 ast.literal_eval
。