一、问题与目标:
字典文本保存在txt文件中:
内容为:
目标就是将其转化为字典,方便提取其中的网址。
二、方法
1.读取字典文本文件,并进行规范处理。即只含有字典文本部分,把空白、换行号、逗号等全部去掉。
代码:
f = open(r'C:\Users\Lenovo\Desktop\字典文本文件.txt','r',encoding='utf-8')
a = f.readlines()
b = []
for i in a:
a0 = i.strip('\n')
a0 = a0.strip(',')
a0 = a0.strip()
b.append(a0)
f.close()
运行结果:
列表的元素就是字典文本,当使用a0['url']来提取链接时,提示错误:
显然,这里还是字典字符串,不是字典。
2. 利用json模块,将字典字符串转化为字典。
import json
d = []
for i in b :
c = json.loads(i)
d.append(c)
运行结果:
这里的列表元素就是字典了。验证一下:
for i in d:
print(i['url'])
运行结果:
三、关于单引号和双引号的问题
完成文章后又看了一下其他人的文章,提到json模块在遇到字典里是单引号时会出现,试验了一下,果然有问题。
把文本换成了单引号的:
运行结果:
解决的办法:
使用ast模块。
ast模块中的literal_eval方法可以把数据还原成它本身或者是能够转化成的数据类型。同时在转换时会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算,比较安全
import ast
d = []
for i in b :
c = ast.literal_eval(i)
d.append(c)
for i in d:
print(i['url'])
运行结果:
又试了下,当换成双引号时,也没有出问题。
四、总结。
将文本数据转化为python可用的数据类型时,json是一种方法,但ast模块中的literal_eval方法才是一种更好、更全面、更安全的方法。
验证如下:我在txt文本中最后一行加了一个列表文本。
验证代码如下:
import ast
d = []
for i in b :
c = ast.literal_eval(i)
d.append(c)
for i in d:
try:
print(i['url'])
except Exception as e:
print(i)
print(i[2])
运行结果:
显然,如果是字典字符串转换化为字典数据,如果是列表字符串就转化成了列表数据。
可见ast模块中的literal_eval方法之强大。