通常情况下我们会把一些python对像作为字符串保存在excelcsv文件中,而在后期读取数据的时候又想将文件中的字符串转换成原先的python对象,如列表、字典等,方便处理。最长用的方法是使用json.loadseval两种方法。

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'}