字典有由鍵值對組成,有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。
