前言分組原理
成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比鶴山網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式鶴山網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋鶴山地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴(lài)。
核心:
1.不論分組鍵是數(shù)組、列表、字典、Series、函數(shù),只要其與待分組變量的軸長(zhǎng)度一致都可以傳入groupby進(jìn)行分組。
2.默認(rèn)axis=0按行分組,可指定axis=1對(duì)列分組。
對(duì)數(shù)據(jù)進(jìn)行分組操作的過(guò)程可以概括為:split-apply-combine三步:
1.按照鍵值(key)或者分組變量將數(shù)據(jù)分組。
2.對(duì)于每組應(yīng)用我們的函數(shù),這一步非常靈活,可以是python自帶函數(shù),可以是我們自己編寫(xiě)的函數(shù)。
3.將函數(shù)計(jì)算后的結(jié)果聚合。
1 分組模式及其對(duì)象
1.1 分組的一般模式
三個(gè)要素:分組依據(jù)、數(shù)據(jù)來(lái)源、操作及其返回結(jié)果
df.groupby(分組依據(jù))[數(shù)據(jù)來(lái)源].使用操作
1.2 分組依據(jù)的本質(zhì)
1.3Groupby 對(duì)象
通過(guò) ngroups 屬性,可以訪問(wèn)分為了多少組:
通過(guò) groups 屬性,可以返回從 組名映射到 組索引列表的字典:
當(dāng) size 作為 DataFrame 的屬性時(shí),返回的是表長(zhǎng)乘以表寬的大小,但在 groupby 對(duì)象上表示統(tǒng)計(jì)每個(gè)組的 元素個(gè)數(shù):
通過(guò) get_group 方法可以直接獲取所在組對(duì)應(yīng)的行,此時(shí)必須知道組的具體名字:
1.4 分組的三大操作
分組的三大操作:聚合、變換和過(guò)濾
2.聚合函數(shù)
2.1內(nèi)置聚合函數(shù)
包括如下函數(shù): max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多個(gè)函數(shù)
當(dāng)使用多個(gè)聚合函數(shù)時(shí),需要用列表的形式把內(nèi)置聚合函數(shù)的對(duì)應(yīng)的字符串傳入,先前提到的所有字符串都是合法的。
【b】對(duì)特定的列使用特定的聚合函數(shù)
對(duì)于方法和列的特殊對(duì)應(yīng),可以通過(guò)構(gòu)造字典傳入 agg 中實(shí)現(xiàn),其中字典以列名為鍵,以聚合字符串或字符串列表為值。
【c】使用自定義函數(shù)
在 agg 中可以使用具體的自定義函數(shù),需要注意傳入函數(shù)的參數(shù)是之前數(shù)據(jù)源中的列,逐列進(jìn)行計(jì)算
【d】聚合結(jié)果重命名 如果想要對(duì)結(jié)果進(jìn)行重命名,只需要將上述函數(shù)的位置改寫(xiě)成元組,元組的第一個(gè)元素為新的名字,第二個(gè)位置為原來(lái)的函數(shù),包括聚合字符串和自定義函數(shù)
3 變換和過(guò)濾
3.1 變換函數(shù)與 transform 方法
變 換 函 數(shù) 的 返 回 值 為 同 長(zhǎng) 度 的 序 列, 最 常 用 的 內(nèi) 置 變 換 函 數(shù) 是 累 計(jì) 函 數(shù):cum- count/cumsum/cumprod/cummax/cummin ,它們的使用方式和聚合函數(shù)類(lèi)似,只不過(guò)完成的是組內(nèi) 累計(jì)操作。
3.2 組索引與過(guò)濾
過(guò)濾在分組中是對(duì)于組的過(guò)濾,而索引是對(duì)于行的過(guò)濾
組過(guò)濾作為行過(guò)濾的推廣,指的是如果對(duì)一個(gè)組的全體所在行進(jìn)行統(tǒng)計(jì)的結(jié)果返回 True 則會(huì)被保留,F(xiàn)alse 則該組會(huì)被過(guò)濾,最后把所有未被過(guò)濾的組其對(duì)應(yīng)的所在行拼接起來(lái)作為 DataFrame 返回。
在 groupby 對(duì)象中,定義了 filter 方法進(jìn)行組的篩選,其中自定義函數(shù)的輸入?yún)?shù)為數(shù)據(jù)源構(gòu)成的 DataFrame 本身,在之前例子中定義的 groupby 對(duì)象中,傳入的就是 df[['Height', 'Weight']] ,因此所有表方法和屬性 都可以在自定義函數(shù)中相應(yīng)地使用,同時(shí)只需保證自定義函數(shù)的返回為布爾值即可。
4 跨列分組
4.1 apply 的引入
4.2 apply 的使用
在設(shè)計(jì)上,apply 的自定義函數(shù)傳入?yún)?shù)與 filter 完全一致,只不過(guò)后者只允許返回布爾值
【a】標(biāo)量情況:結(jié)果得到的是 Series ,索引與 agg 的結(jié)果一致
【b】Series 情況:得到的是 DataFrame ,行索引與標(biāo)量情況一致,列索引為 Series 的索引
【c】DataFrame 情況:得到的是 DataFrame ,行索引最內(nèi)層在每個(gè)組原先 agg 的結(jié)果索引上,再加一層返 回的 DataFrame 行索引,同時(shí)分組結(jié)果 DataFrame 的列索引和返回的 DataFrame 列索引一致
把之前教程的地址移過(guò)來(lái)
合并帖子的內(nèi)容:【整理】【多圖詳解】如何在Windows下開(kāi)發(fā)Python:在cmd下運(yùn)行Python腳本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE
為出版而整理:每章都加了摘要,每章都完善了架構(gòu)。
整理章節(jié)的架構(gòu);整理第一章的內(nèi)容
添加Python學(xué)習(xí)資料目錄
前言
1. 本文目的
2. 看此文之前你所要掌握的知識(shí)
1. Python簡(jiǎn)介
1.1. 什么是Python
1.1.1. Python這個(gè)單詞的本意是蟒蛇
1.1.2. Python是一種計(jì)算機(jī)語(yǔ)言
1.1.3. 作為計(jì)算機(jī)語(yǔ)言的Python的各種叫法的含義
1.1.3.1. Python是一種腳本語(yǔ)言
1.1.3.2. Python是一種交互性的語(yǔ)言
1.1.3.3. Python是一門(mén)解釋性的語(yǔ)言
1.1.3.4. Python是一種面向?qū)ο蟮恼Z(yǔ)言
1.1.3.5. Python是一種高級(jí)語(yǔ)言
1.2. Python能干什么
1.3. Python的特點(diǎn)
1.3.1. 作為解釋性語(yǔ)言的Python的優(yōu)缺點(diǎn)
1.3.1.1. Python的優(yōu)點(diǎn)
1.3.1.2. Python的缺點(diǎn)
1.3.2. Python語(yǔ)言自身的特點(diǎn)
1.4. Python相關(guān)的必備知識(shí)
1.4.1. Python文件的后綴是py
1.4.2. Python的縮寫(xiě)和簡(jiǎn)稱(chēng)
1.4.3. Python的官網(wǎng)
1.4.4. Python的logo圖案
2. 選擇并下載合適的版本的Python
2.1. 為何要注意選擇合適版本的Python
2.2. 如何選擇正確版本的Python
2.2.1. 明確當(dāng)前所處平臺(tái)版本的信息
2.2.2. 選擇可用和速度快的下載源
2.2.3. 選擇合適的版本的Python
3. 如何安裝Python
3.1. 如何在Windows系統(tǒng)中安裝Python
3.1.1. 在Win7中安裝Python
3.2. 如何在Linux系統(tǒng)中安裝Python
3.2.1. 在Ubuntu中安裝Python
3.3. 如何在Mac中安裝Python
4. 選擇合適的Python開(kāi)發(fā)環(huán)境
4.1. 如何在Windows環(huán)境下開(kāi)發(fā)Python
4.1.1. Python的最原始的開(kāi)發(fā)方式是什么樣的
4.1.1.1. 找個(gè)文本編輯器,新建個(gè).py文件,寫(xiě)上Python代碼
4.1.1.2. 打開(kāi)Windows的cmd,并且切換到對(duì)應(yīng)的python腳本所在目錄
4.1.1.2.1. 方法1:手動(dòng)打開(kāi)cmd,并cd到對(duì)應(yīng)路徑
4.1.1.2.2. 方法2:通過(guò)Notepad++的Open current dir cmd
4.1.1.3. 在cmd中去運(yùn)行你的Python腳本(.py文件)
4.1.2. 利用Python的shell進(jìn)行交互式開(kāi)發(fā)又是什么樣的
4.1.2.1. 命令行版本的Python Shell – Python (command line)
4.1.2.2. 帶圖形界面的Python Shell – IDLE (Python GUI)
4.1.2.3. 關(guān)于(command line或GUI版本的)Python Shell的用途
4.1.3. 利用第三方Python的IDE進(jìn)行Python開(kāi)發(fā)又是怎么回事
4.1.3.1. 為何會(huì)有Python的IDE
4.1.3.2. 目前常見(jiàn)的一些Python的IDE
4.1.3.3. Python的IDE和Python代碼編輯器,Windows的cmd,等的關(guān)系
4.1.3.4. 使用IDE時(shí)所遇到的一些常見(jiàn)的問(wèn)題
4.1.3.4.1. IDE只能夠打開(kāi)了文件,并不代表就已經(jīng)在shell中運(yùn)行了該文件
4.1.3.4.2. 需要注意,確保有可以運(yùn)行的Python起始部分的代碼
4.1.4. 總結(jié):到底使用哪種環(huán)境去開(kāi)發(fā)Python
4.1.4.1. 對(duì)初學(xué)者的建議:如何選用Python的開(kāi)發(fā)環(huán)境
4.1.5. 如何在Windows環(huán)境下使用Python腳本
4.1.5.1. 如何在Windows下的cmd中運(yùn)行BlogsToWordpress.py
4.2. 如何在Linux環(huán)境下開(kāi)發(fā)Python
4.3. 如何在Mac環(huán)境下開(kāi)發(fā)Python
5. Python的基本語(yǔ)法和基礎(chǔ)知識(shí)
5.1. 一張圖片入門(mén)Python
5.2. Python中的2.x版本和3.x版本
5.3. Python文件編碼聲明
5.4. Python中的縮進(jìn)
5.5. Python中基本變量的聲明和定義
5.5.1. Python中變量的作用域
5.5.2. Python中變量與C語(yǔ)言中的變量對(duì)比
5.6. Python中的分支結(jié)構(gòu)
5.7. Python中的函數(shù)
5.8. Python中的面向?qū)ο缶幊?/p>
6. 繼續(xù)學(xué)習(xí)Python的思路和方法
6.1. 如何繼續(xù)深入學(xué)習(xí)Python
6.2. 如何利用Python相關(guān)資源
6.2.1. 如何利用Python自帶的手冊(cè)
6.2.2. 如何利用一些在線的Python資源
7. Python常見(jiàn)問(wèn)題及解答
常見(jiàn)問(wèn)題
7.1. 在window的cmd中運(yùn)行python結(jié)果卻調(diào)用了文本編輯器去打開(kāi)了,而不是去調(diào)用Python解析器去運(yùn)行python文件
8. Python相關(guān)資源
參考書(shū)目
插圖清單
4.1. 在Windows下的cmd下面運(yùn)行Python腳本的樣子
4.2. 開(kāi)始菜單中找到的Python (Command Line)
4.3. Python (Command Line)的界面
4.4. 動(dòng)畫(huà)演示如何在Windows的cmd中運(yùn)行Python腳本BlogsToWordpress.py
4.5. 在Mac下的Terminal中運(yùn)行Python腳本:BlogsToWordpress
5.1. Quick Python Script Explanation
5.2. 一張圖入門(mén)Python中文版
7.1. 安裝Python時(shí)選擇Register Extensions
范例清單
4.1. 舉例:用Python的IDLE去做URL解碼
公式清單
4.1. 什么是IDE
4.2. 什么是Python的IDE
一、前言
在python中,函數(shù)參數(shù)的定義和傳遞有以下幾種方式:
語(yǔ)法
意義 ?
def func(name)
普通參數(shù),可以根據(jù)位置匹配,也可以根據(jù)key來(lái)匹配 ?
def func(name=value)
默認(rèn)參數(shù),當(dāng)參數(shù)沒(méi)有傳遞時(shí),使用默認(rèn)值
def func(*iteratable)
將所有剩下的未匹配的參數(shù)收集至一個(gè)tuple中
def func(**dictionary)
將剩下未匹配的參數(shù)收集值一個(gè)dict中
def func(*, name)
必須使用key來(lái)匹配參數(shù)
def func(*other, name)
必須使用key來(lái)匹配參數(shù)
func(value)
函數(shù)調(diào)用,參數(shù)值按傳遞的參數(shù)順序匹配 ?
func(name=value)
函數(shù)調(diào)用,參數(shù)值根據(jù)key來(lái)匹配 ?
func(*iteratable)
函數(shù)調(diào)用,將iteratable容器中的參數(shù)展開(kāi),按位置匹配對(duì)應(yīng)的函數(shù)參數(shù) ?
func(**dictionary)
函數(shù)調(diào)用,將dict中的參數(shù)展開(kāi),按key值來(lái)匹配對(duì)應(yīng)的函數(shù)參數(shù) ?
在python中,參數(shù)可以按照順序傳遞,在調(diào)用函數(shù)時(shí),參數(shù)的值按照傳遞的順序,從左到右依次匹配。并且還可以給參數(shù)傳遞默認(rèn)值,這都很好理解,因?yàn)樵贑、C++、Java等許多語(yǔ)言中,函數(shù)的參數(shù)傳遞都是按照這種方法來(lái)傳遞的。
但python的參數(shù)定義和傳遞除了按照順序傳遞以及可以給默認(rèn)值外,它還有其它的一些特點(diǎn),在進(jìn)一步講解之前,首先說(shuō)明python中函數(shù)調(diào)用中參數(shù)匹配的順序:
按照順序,給沒(méi)有key的參數(shù)賦值,意味著傳遞參數(shù)時(shí),需按順序匹配的參數(shù)必須出現(xiàn)在按key匹配的參數(shù)之前;
給按照key匹配的參數(shù)賦值;
將多余的按照順序匹配但未匹配的參數(shù)值歸入*name的tuple中;
將多余未匹配上的按照key進(jìn)行匹配的參數(shù)值歸入**name的dict對(duì)象中;
將為匹配上的且具有默認(rèn)值的參數(shù)賦默認(rèn)值
二、按key匹配參數(shù)
對(duì)于C、C++這種語(yǔ)言,在調(diào)用函數(shù)時(shí),系統(tǒng)會(huì)首先將函數(shù)地址壓入堆棧,其次按參數(shù)的從右往左的順序,一次壓入堆棧。因此,C、C++這種語(yǔ)言它們只支持按順序匹配形參。而python的做法不同,參數(shù)除了可以按順序匹配,還可以按照參數(shù)名稱(chēng)來(lái)匹配。如:
def func(name, age):
print(name, age)
對(duì)于這個(gè)函數(shù),以下的調(diào)用時(shí)等價(jià)的:
func('rechar', 27) ? ?#按順序匹配
func(name = 'rechar', age = 27) ? ?#按參數(shù)名稱(chēng)匹配,在運(yùn)行時(shí)告訴系統(tǒng)參數(shù)name的值為‘rechar’,age的值為27
func(age = 27, name = 'rechar') ? ?#按參數(shù)名稱(chēng)匹配
func('rechar', age = 27) ? ?#name是按順序匹配,age按名稱(chēng)匹配
在python中,當(dāng)按照參數(shù)名稱(chēng)進(jìn)行匹配參數(shù)是,參數(shù)傳遞的順序是可以任意的,不要求按照函數(shù)定義中參數(shù)的順序進(jìn)行傳遞。在使用名稱(chēng)匹配時(shí),如果需要混合使用按順序匹配規(guī)則,則按順序匹配的參數(shù)必須出現(xiàn)在按key匹配的參數(shù)前,否則會(huì)報(bào)錯(cuò):
func(name = 'rechar', 27)
以上調(diào)用會(huì)報(bào)如下錯(cuò)誤:
三、函數(shù)定義中的”*name“
python在給按順序匹配和按key匹配的參數(shù)賦完值后,如果發(fā)現(xiàn)調(diào)用者傳入的參數(shù)仍有未匹配上的會(huì)發(fā)生什么情況呢?看一下下面的例子:
func('rechar', 27, 32)
運(yùn)行時(shí)我們看到如下錯(cuò)誤:
Traceback (most recent call last):
File "E:\tmp\tt.py", line 5, in module
func('rechar', 27, 32)
TypeError: func() takes 2 positional arguments but 3 were given
哦,python會(huì)抱怨我們傳遞的參數(shù)太多了。那如果確實(shí)在一些情況下,我們無(wú)法保證傳遞的參數(shù)數(shù)量一定和函數(shù)需要的參數(shù)數(shù)相等怎么辦呢?這是就是*iterable這種參數(shù)該登場(chǎng)的時(shí)候了,假如在定義函數(shù)定義是,我們?cè)黾恿艘粋€(gè)參數(shù),這個(gè)參數(shù)以一個(gè)”*“開(kāi)始,那么這個(gè)參數(shù)實(shí)際上是一個(gè)tuple類(lèi)型。假如傳遞的參數(shù)比需要的多,那那些多余的參數(shù)會(huì)被放入這個(gè)tuple中。例如,
def func(name, age, *other):
print(name, age, other)
那么,
func('rechar', 27, 32)
這個(gè)調(diào)用的輸出如下:
rechar 27 (32,)
四、函數(shù)定義中的”**name“
python在將所有未匹配上的非按名稱(chēng)匹配的參數(shù)裝入?yún)?shù)中的tuple之后,假如還有未匹配上的按名稱(chēng)匹配的參數(shù)那情況會(huì)怎樣呢?首先來(lái)看一下下面的示例:
def func(name, age):
print(name, age)
func(name = 'rechar', age = 27, pay='1800')
執(zhí)行時(shí),python又抱怨了:
Traceback (most recent call last):
File "E:\tmp\tt.py", line 5, in module
func(name = 'rechar', age = 27, pay='1800')
TypeError: func() got an unexpected keyword argument 'pay'
它說(shuō)func這個(gè)函數(shù)沒(méi)有名稱(chēng)為”pay“的參數(shù),這種情況或許出現(xiàn)在我們函數(shù)重構(gòu)之后,原來(lái)函數(shù)時(shí)有這個(gè)參數(shù)的。而這個(gè)函數(shù)調(diào)用可能在別處沒(méi)有被修改。假設(shè)即使給了”pay“這個(gè)參數(shù),程序的正確性不受影響,沒(méi)錯(cuò),這就是”**name“參數(shù)的用武之地了。
假如在函數(shù)定義中,給函數(shù)增加一個(gè)以”**“開(kāi)頭的參數(shù),那么這個(gè)參數(shù)實(shí)際上是一個(gè)dict對(duì)象,它會(huì)將參數(shù)調(diào)用中所有沒(méi)有被匹配的按名稱(chēng)傳遞的參數(shù)都放入這個(gè)dict中。例如,
def func(name, age,**other):
print(name, age, other)
func(name = 'rechar', age = 27, pay='1800')
那么運(yùn)行結(jié)果輸出,
rechar 27 {'pay': '1800'}
看到了吧,這里的other就將沒(méi)有匹配的”pay=‘1800’“收入囊中了。
五、規(guī)定調(diào)用必須按名稱(chēng)匹配
當(dāng)我們?cè)诙x函數(shù)時(shí),如果第一個(gè)參數(shù)就是”*name“參數(shù),那么可想而知,我們無(wú)法使用按順序匹配的方式傳遞,因?yàn)樗械陌错樞騻鬟f的參數(shù)值最終的歸宿都會(huì)是這里的tuple當(dāng)中。而為了給后續(xù)的參數(shù)傳遞值,我們只能使用按名稱(chēng)匹配的方法。
六、”**“參數(shù)只能出現(xiàn)在最后一個(gè)形參之后
想想為什么?其實(shí)很好理解,因?yàn)槌霈F(xiàn)在”**“形參之后的形參,無(wú)論使用按順序傳遞還是按名稱(chēng)傳遞,最終都無(wú)法到達(dá)參數(shù)值真正應(yīng)該需要到的地方。所以python規(guī)定,如果需要”**“參數(shù),那它必須是最后一個(gè)形參。否則python會(huì)報(bào)語(yǔ)法錯(cuò)誤。
七、函數(shù)調(diào)用中的”*“
在表格中我們看到了有func(*iteratable)的調(diào)用,這個(gè)調(diào)用的意思是,iteratable必須是一個(gè)可迭代的容器,比如list、tuple;作為參數(shù)傳遞值,它最終傳遞到函數(shù)時(shí),不是以一個(gè)整體出現(xiàn),而是將其中的元素按照順序傳遞的方式,一次賦值給函數(shù)的形參。例如,
li = ['rechar', 27]
func(*li)
這個(gè)函數(shù)調(diào)用與
func('rechar', 27)
是等價(jià)的。
八、函數(shù)調(diào)用中的”**“
知道”*“在函數(shù)調(diào)用中的效果之后,也就很好理解”**“的作用了。它是將傳遞進(jìn)來(lái)的dict對(duì)象分解,每一個(gè)元素對(duì)應(yīng)一個(gè)按名稱(chēng)傳遞的參數(shù),根據(jù)其中的key對(duì)參數(shù)進(jìn)行賦值。
WSGI(Web Server Gateway Interface) 的任務(wù)就是把上面的數(shù)據(jù)在 http server 和 python 程序之間簡(jiǎn)單友好地傳遞。它是一個(gè)標(biāo)準(zhǔn),被定義在 PEP 333 。需要 http server 和 python 程序都要遵守一定的規(guī)范,實(shí)現(xiàn)這個(gè)標(biāo)準(zhǔn)的約定內(nèi)容,才能正常工作。
application端定義非常簡(jiǎn)單,它只要求開(kāi)發(fā)者實(shí)現(xiàn)一個(gè)函數(shù)來(lái)響應(yīng)HTTP請(qǐng)求。
這個(gè)函數(shù)就是一個(gè)符合WSGI標(biāo)準(zhǔn)的一個(gè)HTTP處理函數(shù),它接收兩個(gè)參數(shù):
envrion 和 start_response 這兩個(gè)參數(shù)由服務(wù)端提供,PEP333里給出了一個(gè)wsgi server的簡(jiǎn)單實(shí)現(xiàn):
或者,python中也內(nèi)置了一個(gè)WSGI服務(wù)器模塊 wsgiref , 通過(guò)這個(gè)模塊就可以快速實(shí)現(xiàn)了個(gè)WSGI Server來(lái)測(cè)試我們的 application :
可以看到結(jié)果為 wsgi_client.py 中定義的 hello world
Flask框架中的一個(gè)核心庫(kù) werkzeug 其實(shí)就是Python的WSGI規(guī)范的實(shí)用函數(shù)庫(kù)
一 前言 ?
最近一直在做開(kāi)發(fā)相關(guān)的工作--基于Django的web 平臺(tái),其中需要從model層傳輸數(shù)據(jù)到view 層做數(shù)據(jù)展示或者做業(yè)務(wù)邏輯處理。我們采用通用的Json格式--Json(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于閱讀和程序解析。
二 認(rèn)識(shí)Json
2.1 Json 結(jié)構(gòu)
常見(jiàn)的Json格式為 “名稱(chēng)/值”對(duì)的集合,其中 值可以是對(duì)象,列表,字典,字符串等等。比如
backup_data?=?{"back_to_host":?"dbbk0",
"ip_address":?"10.10.20.3",
"host_name":?"rac4",
"port":?3306}
2.2 使用Json
Python的Json模塊序列化與反序列化的過(guò)程分別是 編碼和解碼。這兩個(gè)過(guò)程涉及到兩組不同的函數(shù)
編碼 把一個(gè)Python對(duì)象編碼轉(zhuǎn)換成Json字符串,json.dumps(data)/json.dump(data,file_handler)
解碼 把Json格式字符串解碼轉(zhuǎn)換成Python對(duì)象,json.loads(data)/json.load(file_handler)
在python中要使用Json模塊做相關(guān)操作,必須先導(dǎo)入:
import Json
2.3 主要函數(shù)
編碼函數(shù)主要有 json.dumps(data)/json.dump(data,file_handler)
json.dumps()的參數(shù)是將python對(duì)象轉(zhuǎn)換為字符串,如使用json.dumps序列化的對(duì)象json_dumps=json.dumps({'a':1, 'b':2}) ,json_dumps='{"b": 2, "a": 1}'
json.dump 是將內(nèi)置類(lèi)型序列化為json對(duì)象后寫(xiě)入文件。
解碼函數(shù)主要由json.loads(data)/json.load(file_handler) ?
json.loads的參數(shù)是內(nèi)存對(duì)象,把Json格式字符串解碼轉(zhuǎn)換成Python對(duì)象,json_loads=json.loads(d_json) ?#{ b": 2, "a": 1},使用load重新反序列化為dict
json.load()的參數(shù)針對(duì)文件句柄,比如本地有一個(gè)文件/tmp/test.json ?json_load=json.load(open('/tmp/test.json'))
具體案例參考如下:
In?[3]:?data={"back_to_host":?"rac1",
...:?"ip_address":?"10.215.20.3",
...:?"host_name":?"rac3",
...:?"port":?3306}
In?[7]:?json_str=json.dumps(data)
In?[8]:?print json_str
{"ip_address":?"10.215.20.3",?"back_to_host":?"rac1",?"host_name":?"rac3",?"port":?3306}
In?[9]:?json_loads=json.load(json_str)
---------------------------------------------------------------------------
AttributeError Traceback?(most recent?call?last)
ipython-input-9-180506f16431?in?module()
----?1 json_loads=json.load(json_str)
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc?in?load(fp,?encoding,?cls,?object_hook,?parse_float,?parse_int,?parse_constant,?object_pairs_hook,?**kw)
284
285?""
注意 從上面的報(bào)錯(cuò)信息來(lái)看 json.loads 傳參是字符串類(lèi)型,并不是文件句柄,沒(méi)有 read()屬性。
In?[10]:?json_loads=json.loads(json_str)
In?[11]:?print json_loads
{u'back_to_host':?u'rac1',?u'ip_address':?u'10.215.20.3',?u'host_name':?u'rac3',?u'port':?3306}
In?[12]:?type(json_loads)
Out[12]:?dict
In?[13]:?type(json_str)
Out[13]:?str
利用dump 將數(shù)據(jù)寫(xiě)入 dump.json
In?[17]:?with open('/tmp/dump.json','w')?as f:
...:?json.dump(json_str,f)
...:
yangyiDBA:~?yangyi$ cat /tmp/dump.json
"{\"ip_address\": \"10.10.20.3\", \"back_to_host\": \"rac1\", \"host_name\": \"rac3\", \"port\": 3306}"
yangyiDBA:~?yangyi$
利用json.load 將dump.sjon的數(shù)據(jù)讀出來(lái)并賦值給 data?
In?[18]:?with open('/tmp/dump.json','r')?as f:
...:?data=json.load(f)
...:
In?[19]:?print data
{"ip_address":?"10.10.20.3",?"back_to_host":?"rac1",?"host_name":?"rac3",?"port":?3306}
三 小結(jié)
本文算是一篇學(xué)習(xí)筆記,主要對(duì)比了json.loads/json.load ?, json.dumps/ json.dump 的使用差異 ,方便以后更好的使用json 。
以上為本次分享內(nèi)容,感謝觀看。
網(wǎng)站欄目:python函數(shù)前言,Python函數(shù)語(yǔ)句
本文網(wǎng)址:http://aaarwkj.com/article18/dssgogp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、小程序開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、微信小程序、軟件開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)