• python_dict json读写文件


    命令汇总:

    json.dumps(obj)            将python数据转化为json
                               Indent实现缩进,ensure_ascii 是否用ascii解析
    json.loads(s)              将json数据转换为python的数据
    json.dump(obj, fp)         转换为json并保存到文件中
    json.load(fp)              从文件中读取json,并转化为python数据

    先贴个完整代码:

     1 data = {
     2     "name": "uhao",
     3     "age": 18,
     4     "feature" : ['', '',  '']
     5 }
     6 
     7 import json  #导入模块
     8 with open('test.json','w') as file: #test.json文本,只能写入状态 如果没有就创建
     9     json.dump(data, file)   #data转换为json数据格式并写入文件
    10     file.close()  #关闭文件
    11 
    12 with open('test.json','r') as fileR:   #打开文本读取状态
    13     R = json.load(fileR)  #解析读到的文本内容 转为python数据 以一个变量接收
    14     fileR.close()  #关闭文件
    15 
    16 fea = R['feature']   #打印变量
    17 print(fea[2])

    运行结果:

    详细步骤都写了,注释。

    看起来简洁方便,似乎毫无难点,那么来愉快的谈一下使用中常见的坑

    不管你要读什么,反正我一点数据也没有:

    Traceback (most recent call last):
      File "/Users/penglong/Documents/python/s10/day3/test.py", line 13, in <module>
        l =  json.load(file)
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 268, in load
        parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
        return _default_decoder.decode(s)
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 357, in raw_decode
        raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

      报错如上,原因十分明显,json没有内容可解析,一般直接从文件中进行排除,会发现读取的文本是空白,也就是说在写入数据的时候就已经发生了错误。但代码并没有报错,如果没有进行写入检测的话,差不多就卡这了,这个原因很简单,大部分是因为在写入时候调用的接口是dumps而不是dump,程序本身可以编译通过,但实际上没有文本写入。导致读取的时候直接报错。如果遇到这个问题,去排查一下写入数据时调用的接口。

    不管你要我写什么,反正我就是写不进去:

      File "/Users/penglong/Documents/python/s10/day3/test.py", line 17, in <module>
        pickle.dump(data,file)
    TypeError: write() argument must be str, not bytes

    报错如上,此错误针对pickle写入,原因也很明显,写入必须是字符串,我猜json不报错的原因很大程度是因为它长的比较像字符串。。忽略这个不靠谱的想法。这个引发的错误留给下一个。解决代码如下:(ps:在2.7里面敲是没遇到这个毛病的,在3.5里面一定要在"wb"状态下才能正常写入。)

    with open("pickle.pk","wb") as file: #改参数"w"为"wb" 代表二进制写入
        pickle.dump(data,file)
        file.close()

        以上,json的错误完全相反,可能报错为TypeError: a bytes-like object is required, not 'str',完全不用举例了,是踩进了pickle的坑里,直接把"wb"状态改回"w"即可解决。然而总有那么些时候并不在意强扭的瓜甜不甜,仅仅是想强行把它给扭下来。假如犯了强迫症,一定要在wb的状态下使用,那么,解决代码如下:(ps:严重不推荐使用。。其实就是我半天不知道毛病在哪,头痛医头脚痛医脚,不管原因,强行把它给写进去了,虽然运行和结果都没错,但肯定有什么地方不对)

    with open("jsondata.json","wb") as file:
        file.write((json.dumps(data).encode("utf-8")))#强制以utf-8转一下byte数据再以普通形式写入 。
        file.close()

    不管你要做什么,反正我就是没有函数存在:

    Traceback (most recent call last):
      File "/Users/penglong/Documents/python/s10/day3/test.py", line 10, in <module>
        json.dumps(data,file)
    AttributeError: module 'json' has no attribute 'dumps'

    报错如上,json没有dumps模块存在。排查本地文件,大部分原因是本地文件有了json.py。python的包导入直接先导入了同级目录下的文件。如果本地文件并没有重复,那么就只能排查安装文件了,python命令行编辑模式下help(json.py) 如果文件存在,可以看到其详细信息和存放位置。但安装文件丢失的情况,我并未遇到。踩到的坑是本地文件重复,反而在安装文件排查了好久。

    作者:含笑半步颠√

    博客链接:https://www.cnblogs.com/lixy-88428977

    声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

  • 相关阅读:
    centos7安装docker-ce最新版
    输出第一个hello word程序(day1)
    centos7安装python3及ipython
    华为防火墙ping不通直连设备
    cisco网络设备基本命令
    linux中ftp
    查找你的域名DNS服务器
    Grafana 安装配置启动
    Jmeter 循环控制器
    CentOs 7查看端口占用情况,以及出现未找到命令的情况
  • 原文地址:https://www.cnblogs.com/lixy-88428977/p/9585701.html
Copyright © 2020-2023  润新知