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

聲明:本文為博主學習感悟總結,水平有限,如果不當,歡迎指正。如果您認為還不錯,歡迎轉載。轉載與引用請注明作者及出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM