python 讀寫 json文件


json的優勢:

1. 數據體積方面。

JSON相對於XML來講,數據的體積小,傳遞的速度更快些。

 

2. 傳輸速度方面。

JSON的速度要遠遠快於XML

 

3. 數據格式

數據格式比較簡單, 易於讀寫, 格式都是壓縮的。

 

4. 與python的交互使用方便

json 是 k-v結構的形式,

簡單來說, 如果是一個key,對應一個value.中間用 : 分隔,最外面用{}包圍, 不同鍵值對之間用逗號,隔開

{‘key1’: 'value1', 'key2': 'value2', 'key3': 'value3'}

如果有一個Key對應着多個value的情況,用[]把對應的所有value包括起來。

{'key1': ['v11', 'v12', 'v13'], 'key2':'v22'}

復雜一點的還有這樣的,不過其實原理都一樣。

{
     
 
"people":[
         
{
 
"firstName": "Brett",
             
"lastName":"McLaughlin"
         
},
        
{
             
"firstName":"Jason",
 
"lastName":"Hunter"
}
]
}

  

json是什么呢?

  • 是一種輕量級的數據交換格式。
  • 完全獨立於編程語言的文本格式來存儲和表示數據。
  • 簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閱讀和編寫,易於機器解析和生成,並有效地提升網絡傳輸效率。

json JavaScript Object Notation(JS對象標記)和JavaScript 的關系

JSON格式在語法上與創建JavaScript對象的代碼相同。由於這種相似性,JavaScript程序可以輕松地將JSON數據轉換為JavaScript對象。JavaScript是一種語言, 而json終其還是一種文本格式,是一堆字符串。

 由於json是文本格式, 我們要用python去操縱它,首先需要把這種格式轉換為python中的字典。

with open('finance/finance_company.json', encoding='utf-8') as f:
    line = f.readline()
    print(type(line))
    f.close()

輸出結果:

<class 'str'> 

可以看出來,我們從json格式中讀出來為str類型。  

 

我們調用json庫的loads方法。

json.load(fpcls=Noneobject_hook=Noneparse_float=Noneparse_int=Noneparse_constant=Noneobject_pairs_hook=None**kw)

object_hook是一個可選的函數,它將被任何對象字面值解碼(dict)的結果調用。將使用object_hook的返回值而不是dict。該特征可以用於實現定制解碼器(例如,JSON-RPC類提示)。

object_pairs_hook是一個可選的函數,它將使用任何對象字面值的結果進行調用,並使用對的有序列表進行解碼。將使用object_pairs_hook的返回值,而不是dict。該特征可以用於實現依賴於鍵和值對被解碼的順序的自定義解碼器(例如,collections.OrderedDict()將記住插入的順序)。如果還定義了object_hook,則object_pairs_hook優先。

parse_float(如果指定)將使用要解碼的每個JSON浮點的字符串進行調用。默認情況下,這相當於float(num_str)。這可以用於使用另一個數據類型或解析器為JSON浮動(例如。decimal.Decimal)。

parse_int(如果指定)將使用要解碼的每個JSON int的字符串進行調用。默認情況下,這相當於int(num_str)。這可以用於使用另一個數據類型或解析器為JSON整數(例如。float)。

parse_constant如果指定,將使用以下字符串之一調用:'-Infinity','Infinity','NaN'。這可以用於引發異常,如果遇到無效的JSON數字。

 

在版本3.1中更改: parse_constant不會在“null”,“true”和“false”上調用。

要使用自定義JSONDecoder子類,請使用cls kwarg;否則使用JSONDecoder。額外的關鍵字參數將被傳遞給類的構造函數。

json.loads(sencoding=Nonecls=Noneobject_hook=Noneparse_float=Noneparse_int=Noneparse_constant=Noneobject_pairs_hook=None**kw)

 除了多了一個編碼參數, 其余的都與json.load一樣。

json.load用來加載文件, 而json.loads用來加載字符串(很明顯,因為多了個s(string))

import json

with open('finance/finance_company.json', encoding='utf-8') as f:
    line = f.readline()
    d = json.loads(line)
    print(type(d))
    f.close()


輸出:

<class 'dict'>

讀取范例:

new.json

{"name": "異享金融", "company_url": "http://www.yixiangjinrong.com", "telphone": "0371-55056647", "crawl_time": "2017-07-13 16:11:16"}

  

readjson.py

import json

with open('test.json', encoding='utf-8') as f:
    line = f.readline()
    d = json.loads(line)
    name = d['name']
    company_url = d['company_url']
    telephone = d['telphone']
    crawl_time = d['crawl_time']
    print(name, company_url, telephone, crawl_time)
    f.close()

輸出結果:

異享金融 http://www.yixiangjinrong.com 0371-55056647 2017-07-13 16:11:16

這樣就成功的讀取了json文件啦。

 

寫json文件

json.dump(objfpskipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Nonedefault=Nonesort_keys=False**kw)

json模塊總是產生str對象,而不是bytes對象。因此,fp.write()必須支持str輸入。

如果ensure_ascii為true(默認值),則輸出將保證所有傳入的非ASCII字符都轉義。如果ensure_ascii為false,則這些字符將按原樣輸出。

如果check_circular為false(默認值:True),則將跳過容器類型的循環引用檢查,循環引用將導致OverflowError

如果allow_nan為false(默認值:True),則將是ValueError序列化超出范圍float值(nan,inf,-inf),嚴格遵守JSON規范。如果allow_nan為true,則將使用與其等效的JavaScript代碼(NaN,Infinity,-Infinity)。

如果縮進是非負整數或字符串,那么JSON數組元素和對象成員將以該縮進級別打印。縮進級別0,負數或""將只插入換行符。None(默認值)選擇最緊湊的表示。使用正整數縮進縮進,每個級別有許多空格。如果縮進是字符串(例如"\t"),則該字符串用於縮進每個級別。

如果sort_keys為真(默認值:False),則字典的輸出將按鍵排序。

使用默認的 ensure_ascii=True時, json文件變成了這樣:

{"name": "\u4e24\u53ea\u8001\u864e", "company_url": "http://www.twotiger.com/", "telphone": "010-64789918", "crawl_time": "2017-07-16 22:57:15"}

 ensure_ascii=Flase, 中文就成功出現

{"name": "異享金融", "company_url": "http://www.yixiangjinrong.com", "telphone": "0371-55056647", "crawl_time": "2017-07-13 16:11:16"}

因為該方法把我們的中文自動轉義了, 變成了ASCII碼, 所以導致了中文看着錯亂了。加上這句就好了。

如何讀取完整的文件

上面主要示例了json的使用。但是在實際開發過程中我們是需要對這個文件進行讀取的。下面我們看看如何讀取。

我們都應該知道python讀取文件有三種方法。

read(), readline(), radlines()

read()直接讀取出字符串,並且字符串或者字符對象返回。

readline() 讀取文本中的一行

readlines() 讀取文本中的所有內容並放入緩存區。

下面是使用的readline讀取整個文本示例:

with open(file_path, 'r', encoding='utf-8') as f:
        try:
            while True:
                line = f.readline()
                if line:
                    r = json.loads(line)
                    # print(r)
                else:
                    break
        except:
            f.close()

這樣就可以讀取所有文本並解析成Python可以操作的數據模式了

 


免責聲明!

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



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