python dict json讀寫檔案

2022-02-14 05:44:46 字數 3855 閱讀 9841

命令彙總:

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 =67

import json #

匯入模組

8 with open('

test.json

','w

') as file: #

test.json文字,只能寫入狀態 如果沒有就建立

9 json.dump(data, file) #

data轉換為json資料格式並寫入檔案

10 file.close() #

關閉檔案

1112 with open('

test.json

','r

') as filer: #

開啟文字讀取狀態

13 r = json.load(filer) #

解析讀到的文字內容 轉為python資料 以乙個變數接收

14 filer.close() #

關閉檔案

1516 fea = r['

feature

'] #

列印變數

17print(fea[2])

執行結果:

詳細步驟都寫了,注釋。

看起來簡潔方便,似乎毫無難點,那麼來愉快的談一下使用中常見的坑

不管你要讀什麼,反正我一點資料也沒有:

traceback (most recent call last):

file

"/users/penglong/documents/python/s10/day3/test.py

", line 13, in

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

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

json.dumps(data,file)

attributeerror: module

'json

' has no attribute '

dumps

'

報錯如上,json沒有dumps模組存在。排查本地檔案,大部分原因是本地檔案有了json.py。python的包匯入直接先導入了同級目錄下的檔案。如果本地檔案並沒有重複,那麼就只能排查安裝檔案了,python命令列編輯模式下help(json.py) 如果檔案存在,可以看到其詳細資訊和存放位置。但安裝檔案丟失的情況,我並未遇到。踩到的坑是本地檔案重複,反而在安裝檔案排查了好久。

物理讀,邏輯讀,預讀

在使用set statistics io on語句統計i o時候,我們會看到類似下面的結果 掃瞄計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。那麼它們代表什麼呢?預讀 用於估計資訊,去硬碟讀取資料到快取。物理讀 ...

髒讀,不可重複的讀,虛讀

引用 髒讀dirty reads 當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說 transaction 1 修改了一行資料,然後 transaction 2 在 transaction 1 還未提交修改操作之前讀取了被修改的行。如果 transaction 1 回滾了修改操作,那麼 tr...

C 檔案讀(逐行讀 逐單詞讀)

include include include include include using namespace std int main ifile.clear ifile.seekg 0 檔案重定位 while ifile word coutvector iterator it text.begi...