通常情况下我们会把一些python对像作为字符串保存在excel
或csv
文件中,而在后期读取数据的时候又想将文件中的字符串转换成原先的python对象,如列表、字典等,方便处理。最长用的方法是使用json.loads
和eval
两种方法。
1. json.loads()
在使用json.loads
方法将字符串转换成python对象的时候,要注意保存文件时在将python对象转换成字符串时使用json.dumps
,不要使用str
,否则很容易出错
x = [1,2,3,45]
f = open("/share_v3/test.txt", "w", encoding="utf-8")
f.write(json.dumps(x))
f.close()
fr = open("/share_v3/test.txt", "r", encoding="utf-8")
lines= fr.readlines()
for l in lines:
res = json.loads(l)
print(type(res))
print(res)
输出
<class 'list'>
[1, 2, 3, 45]
如下这种情况就会报错
x = {1:"xiaofang",2:"xiaohua"}
f = open("/share_v3/test.txt", "w", encoding="utf-8")
# f.write(json.dumps(x))
f.write(str(x))
f.close()
fr = open("/share_v3/test.txt", "r", encoding="utf-8")
lines= fr.readlines()
for l in lines:
print(l)
res = json.loads(l)
print(type(res))
print(res)
{1: 'xiaofang', 2: 'xiaohua'}
发生异常: JSONDecodeError
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
File "/share_v3/fangcheng/dev/youXuepai/test.py", line 97, in <module>
res = json.loads(l)
出错的原因在于,直接写入文件或使用str
时,会将字典里的双引号变成单引号,而json.loads
要求的是双引号。
2. eval()
那么如果按上面str
方式保存了文件,如何加载成python对象呢?那就需要用eval
了,eval
是python自带的,需要另外安装包,eval 功能比json.loads
强大,既可以加载1以json.dumps
方式保存的文件,也可以加载以str
方式保存的文件
x = {1:"xiaofang",2:"xiaohua"}
f = open("/share_v3/test.txt", "w", encoding="utf-8")
# f.write(json.dumps(x))
f.write(str(x))
f.close()
fr = open("/share_v3/test.txt", "r", encoding="utf-8")
lines= fr.readlines()
for l in lines:
print(l)
res = eval(l)
print(type(res))
print(res)
输出
<class 'dict'>
{1: 'xiaofang', 2: 'xiaohua'}