本教程所有源碼下載鏈接:https://share.weiyun.com/5xmFeUO 密碼:fzwh6g
本教程首發(fā)于GitOPEN's Home瓤狐,轉(zhuǎn)載請(qǐng)征求作者同意
基礎(chǔ)知識(shí)
環(huán)境搭建
Python安裝
平時(shí)能接觸到的操作系統(tǒng)非Windows踊沸、macOS数苫、Linux莫屬。其中Windows是我們?nèi)粘V凶畛S玫腛S,它軟件更多祸憋、辦公和游戲可以兼得;macOS由于搭載其的電腦外表漂亮肖卧、屏幕優(yōu)秀蚯窥、性能均衡,而被很多設(shè)計(jì)者和程序員所喜愛(ài);Linux在服務(wù)器領(lǐng)域是無(wú)可匹敵拦赠,幾乎所有大型應(yīng)用服務(wù)器都部署于Linux系統(tǒng)巍沙,常用的Linux服務(wù)器系統(tǒng)有CentOS、Ubuntu Server等荷鼠,但是Linux桌面版也在程序員中應(yīng)用較廣句携,便捷的終端、穩(wěn)定的性能是編程的首選允乐。
由于macOS和Ubuntu系統(tǒng)都自帶python環(huán)境矮嫉,因此,我們只講解Windows下Python的安裝和配置喳篇。感興趣的同學(xué)敞临,可以自己在虛擬機(jī)中測(cè)試和熟悉Linux系統(tǒng),推薦Ubuntu18.04麸澜。
Windows下安裝Python
熟悉一下Python的主頁(yè):
下載挺尿。官方的最新版已經(jīng)更新到了3.7.0,但是我們下載的版本是Python3.6.5炊邦,因此编矾,我們點(diǎn)擊View the full list of downloads。
只需要記住馁害,不同架構(gòu)的Windows系統(tǒng)窄俏,選擇不同的安裝包下載。
安裝碘菜。按圖示操作即可凹蜈。
-
雙擊安裝包,選擇自定義安裝忍啸,方便以后使用仰坦。
image -
直接下一步。
image -
修改路徑计雌,將路徑改為
c:\Python36
悄晃。image -
安裝成功
image
環(huán)境變量檢測(cè)與設(shè)置。
-
打開(kāi)cmd命令行凿滤。
image -
輸入
python
妈橄,提示python版本等信息表示環(huán)境變量設(shè)置成功。image -
如果輸入python后翁脆,提示不是內(nèi)部命令或外部命令眷蚓,則表示環(huán)境變量沒(méi)有配置好。
image
設(shè)置環(huán)境變量鹃祖。
-
桌面右擊
計(jì)算機(jī)
???溪椎,選擇屬性普舆,然后,再次選擇高級(jí)系統(tǒng)設(shè)置校读。
image -
在
高級(jí)
一欄中點(diǎn)擊環(huán)境變量
沼侣,打開(kāi)環(huán)境變量
設(shè)置窗口。image -
點(diǎn)擊
新建
歉秫,在變量名中輸入PATH
(大寫(xiě))蛾洛,在變量值中輸入C:\Python36\Scripts\;C:\Python36\
,C:\Python36\Scripts\
文件夾下有一些常用工具雁芙,例如pip
包管理工具轧膘,也加入到環(huán)境變量中,這樣方便以后使用兔甘;C:\Python36\
就是python的安裝目錄谎碍。image 將cmd命令行都關(guān)閉,重新打開(kāi)cmd洞焙,再次輸入
python
進(jìn)行驗(yàn)證蟆淀。
Python環(huán)境到這里就安裝完畢了。
包管理工具pip
pip是Python的一款包管理工具澡匪,由于眾所周知的原因熔任,用pip安裝庫(kù)的速度簡(jiǎn)直是“是可忍孰不可忍”。因此唁情,我們有必要加速pip包管理工具的下載速度疑苔。
pip的基本使用
Windows中,打開(kāi)cmd命令行甸鸟,輸入pip
后惦费,可以看到使用方法:
# 搜索requests包
pip search requests
# 升級(jí)requests包
pip install requests --upgrade
# 卸載requests包
pip uninstall requests
# 查看待更新包
pip list --outdate
升級(jí)pip包管理器
python -m pip install --upgrade pip
加速pip下載速度
在某程序員論壇上,有這樣一個(gè)軟笑話(huà):《安裝scrapy快瘋了抢韭,一個(gè)下午沒(méi)了》???
我們使用清華大學(xué)開(kāi)源軟件鏡像站的pypi鏡像進(jìn)行pip下載加速趁餐。
臨時(shí)加速
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
注意,
simple
不能少篮绰,是https
而不是http
永久加速1
修改
~/.config/pip/pip.conf
(Linux),
%APPDATA%\pip\pip.ini
(Windows 10) ,
C:\Users\Administrator\AppData\Roaming\pip\pip.ini
(Windows7),
$HOME/Library/Application Support/pip/pip.conf
(macOS) (沒(méi)有就創(chuàng)建一個(gè))季惯,
修改 index-url
至tuna吠各,例如
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
pip 和 pip3 并存時(shí),只需修改 ~/.pip/pip.conf
勉抓。
永久加速2
使用腳本永久加速贾漏,只需用Python執(zhí)行oh-my-tuna.py
文件即可設(shè)置好鏡像站加速,
該腳本在我們的源碼中有提供藕筋,位置為CrawlerLessons/codes/lesson01/oh-my-tuna.py
纵散,下載后,直接在命令行中運(yùn)行即可:
python on-my-tuna.py
安裝IPython
ipython
是一個(gè)python
的交互式shell
,比默認(rèn)的python shell
好用得多伍掀,支持變量自動(dòng)補(bǔ)全掰茶,自動(dòng)縮進(jìn),支持bash shell
命令蜜笤,內(nèi)置了許多很有用的功能和函數(shù)濒蒋。學(xué)習(xí)ipython
將會(huì)讓我們以一種更高的效率來(lái)使用python
。同時(shí)它也是利用Python進(jìn)行科學(xué)計(jì)算和交互可視化的一個(gè)最佳的平臺(tái)把兔。
使用pip
安裝IPython
:
pip install ipython
使用IPython
沪伙,再命令行中輸入ipython
即可進(jìn)入交互式shell
:
╭─sunjiajia@Mac /Users/sunjiajia ?system?
╰─$ ipython
Python 3.6.5 (default, Jul 2 2018, 18:32:34)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
IDE 的選擇
在以后的編程中,我們使用PyCharm
這款享譽(yù)全球的IDE县好,開(kāi)發(fā)拄衰、調(diào)試城舞、支持網(wǎng)頁(yè)開(kāi)發(fā)和支持?jǐn)?shù)據(jù)庫(kù),可以滿(mǎn)足我們幾乎所有的開(kāi)發(fā)需求。
PyCharm
是收費(fèi)軟件抬旺,但也提供社區(qū)免費(fèi)版本,雖然功能有所減少旗扑,但是也夠我們后續(xù)寫(xiě)爬蟲(chóng)了捎谨。
PyCharm
下載地址:官方網(wǎng)址。
PyCharm的基本使用
創(chuàng)建項(xiàng)目:
選擇項(xiàng)目路徑:
創(chuàng)建Python文件禀酱,命名為test01.py
:
在test01.py
中輸入以下python代碼炬守,右擊空白處,選擇Run test01
剂跟,運(yùn)行當(dāng)前python文件:
PyCharm常用設(shè)置項(xiàng)如圖所示:
HTML和CSS基礎(chǔ)知識(shí)
這一節(jié)我們學(xué)習(xí)網(wǎng)頁(yè)編程的基礎(chǔ)知識(shí)减途。這節(jié)課目標(biāo)是,了解網(wǎng)頁(yè)的基本知識(shí)曹洽,在寫(xiě)爬蟲(chóng)的時(shí)候可以清晰的分析目標(biāo)數(shù)據(jù)所在的結(jié)構(gòu)鳍置,從而更輕松的拿到自己想要的數(shù)據(jù)。
無(wú)論是動(dòng)態(tài)加載送淆,還是延遲加載税产,無(wú)論是文字還是多媒體,最終在瀏覽器中展示給我們偷崩,都是以HTML語(yǔ)法來(lái)展示辟拷;無(wú)論是絢麗的動(dòng)畫(huà)頁(yè)面效果,還是表格的樣式阐斜,都可以用CSS來(lái)進(jìn)行定制衫冻。
下面來(lái)一個(gè)概念簡(jiǎn)介,來(lái)自百度百科的內(nèi)容:
HTML谒出,即超文本標(biāo)記語(yǔ)言(英語(yǔ):HyperText Markup Language)隅俘,是標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用邻奠,也是一種規(guī)范,一種標(biāo)準(zhǔn)为居,它通過(guò)標(biāo)記符號(hào)來(lái)標(biāo)記要顯示的網(wǎng)頁(yè)中的各個(gè)部分碌宴。網(wǎng)頁(yè)文件本身是一種文本文件,通過(guò)在文本文件中添加標(biāo)記符颜骤,可以告訴瀏覽器如何顯示其中的內(nèi)容(如:文字如何處理唧喉,畫(huà)面如何安排,圖片如何顯示等)忍抽。
CSS八孝,即層疊樣式表(英文全稱(chēng):Cascading Style Sheets),是一種用來(lái)表現(xiàn)HTML或XML等文件樣式的計(jì)算機(jī)語(yǔ)言鸠项。CSS不僅可以靜態(tài)地修飾網(wǎng)頁(yè)干跛,還可以配合各種腳本語(yǔ)言動(dòng)態(tài)地對(duì)網(wǎng)頁(yè)各元素進(jìn)行格式化。
HTML基本標(biāo)簽
標(biāo)簽名 | 含義 |
---|---|
<!--...--> |
注釋標(biāo)簽用于在源代碼中插入注釋祟绊。注釋不會(huì)顯示在瀏覽器中楼入。 |
<!DOCTYPE> |
<!DOCTYPE> 聲明必須是 HTML 文檔的第一行,位于 <html> 標(biāo)簽之前牧抽。<!DOCTYPE> 聲明不是 HTML 標(biāo)簽嘉熊;它是指示 web 瀏覽器關(guān)于頁(yè)面使用哪個(gè) HTML 版本進(jìn)行編寫(xiě)的指令。在 HTML5 中只有一種寫(xiě)法<!DOCTYPE html>
|
<html> |
<html> 與 </html> 標(biāo)簽限定了文檔的開(kāi)始點(diǎn)和結(jié)束點(diǎn)扬舒,在它們之間是文檔的頭部和主體阐肤。正如您所了解的那樣,文檔的頭部由 <head> 標(biāo)簽定義讲坎,而主體由<body> 標(biāo)簽定義孕惜。 |
<head> |
用于定義文檔的頭部,它是所有頭部元素的容器晨炕。<head> 中的元素可以引用腳本衫画、指示瀏覽器在哪里找到樣式表、提供元信息等等瓮栗。 |
<meta> |
提供有關(guān)頁(yè)面的元信息(meta-information)削罩,比如針對(duì)搜索引擎和更新頻度的描述和關(guān)鍵詞。 |
<title> |
定義文檔的標(biāo)題费奸。 |
<style> |
用于為 HTML 文檔定義樣式信息鲸郊。type 屬性是必需的,定義 style 元素的內(nèi)容货邓。唯一可能的值是 "text/css" 。 |
<link> |
定義文檔與外部資源的關(guān)系四濒,最常見(jiàn)的用途是鏈接樣式表换况。 |
<body> |
body 元素定義文檔的主體职辨,包含文檔的所有內(nèi)容(比如文本、超鏈接戈二、圖像舒裤、表格和列表等等。) |
? | ? |
HTML常用標(biāo)簽
標(biāo)簽名 | 含義 |
---|---|
<a target="_blank">新聞</a> |
定義超鏈接 |
<img src="images/logo.png" alt="GitOPEN搜索觉吭,最貼心搜索"> |
插入圖片 |
<table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td> <td>$100</td></tr></table> |
表格 |
<div>我是div</div> |
可定義文檔中的分區(qū)或節(jié) |
<p><span>some text.</span>some other text.</p> |
被用來(lái)組合文檔中的行內(nèi)元素腾供。 |
<ul><li>Coffee</li><li>Milk</li></ul> |
無(wú)序列表 |
<ol><li>Coffee</li><li>Milk</li></ol> |
有序列表 |
<input type="button" value="搜索一下"/> |
用于搜集用戶(hù)信息。根據(jù)不同的 type 屬性值鲜滩,輸入字段可以是text 伴鳖、復(fù)選框checkbox 、單選按鈕radio 徙硅、button 榜聂、submit 等等。 |
CSS語(yǔ)法
HTML整合CSS的方式一
直接將css寫(xiě)在HTML文件中嗓蘑,代碼CrawlerLessons/codes/lesson01/HTMLDemo/demo01.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我是GitOPEN</title>
<style>
#div01 {
background-color: #2d78f4;
}
.div02 {
background-color: cadetblue;
font-style: oblique;
font-weight: bold;
}
</style>
</head>
<body>
<div id="div01">
我是div01须肆,我的樣式使用了id選擇器(div01)
</div>
<div class="div02">
我是div02,我的樣式使用了類(lèi)選擇器(div02)
</div>
<div class="div02">
我是div03桩皿,我的樣式使用了類(lèi)選擇器(div02)
</div>
</body>
</html>
HTML整合CSS的方式二
css寫(xiě)在單獨(dú)的文件中豌汇,代碼CrawlerLessons/codes/lesson01/HTMLDemo/demo02.css
#div01 {
background-color: #2d78f4;
}
.div02 {
background-color: cadetblue;
font-style: oblique;
font-weight: bold;
}
html也是一個(gè)單獨(dú)的文件,代碼CrawlerLessons/codes/lesson01/HTMLDemo/demo02.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我是GitOPEN</title>
<link rel="stylesheet" href="demo02.css">
</head>
<body>
<div id="div01">
我是div01泄隔,我的樣式使用了id選擇器(div01)
</div>
<div class="div02">
我是div02拒贱,我的樣式使用了類(lèi)選擇器(div02)
</div>
<div class="div02">
我是div03,我的樣式使用了類(lèi)選擇器(div02)
</div>
</body>
</html>
CSS常用屬性
屬性名 | 作用 |
---|---|
font-size | 字號(hào)大小 |
font-style | 字體格式 |
font-weight | 字體粗細(xì) |
color | 文本顏色 |
text-decoration | 超鏈接設(shè)置梅尤。line-through添加刪除線柜思;blink文字閃動(dòng);none不顯示上述任何效果 |
background-color | 背景顏色 |
backgroud-image | 背景圖片(地址) |
background-repeat | 是否重復(fù)巷燥。no-repeat不重復(fù)平鋪赡盘;repeat-x或者y:只在水平或者垂直方向上平鋪 |
text-align | 文本對(duì)齊。left左對(duì)齊缰揪;right右對(duì)齊陨享;center居中對(duì)齊;justify:相對(duì)左右兩端對(duì)齊 |
display | 顯示樣式钝腺。block塊級(jí)元素抛姑,在對(duì)象前后都換行;inline在對(duì)象前后都不換行艳狐;list-item在對(duì)象前后都換行定硝,增加了項(xiàng)目符號(hào) |
Python必備知識(shí)點(diǎn)
基礎(chǔ)數(shù)據(jù)類(lèi)型
變量及其類(lèi)型的含義
Python中的變量不需要聲明,變量在使用前都必須賦值毫目,在賦值以后蔬啡,該變量才會(huì)被創(chuàng)建诲侮。
Python中的變量就是變量,它本身沒(méi)有類(lèi)型箱蟆,通常所說(shuō)的“變量類(lèi)型”沟绪,表示的意思是變量所指向的內(nèi)存中對(duì)象的類(lèi)型。
name = 'GitOPEN'
age = 18
salary = 99999.99
等號(hào)(=)叫做運(yùn)算符空猜,用來(lái)給變量name
绽慈、age
、salary
賦值辈毯,左邊是一個(gè)變量名坝疼,右邊是存儲(chǔ)在變量中的值。
在給變量賦值不同類(lèi)型的對(duì)象漓摩,那么裙士,變量就有了類(lèi)型。
name
是字符串變量管毙,age
是整型變量腿椎,salary
是浮點(diǎn)型變量。
多個(gè)變量賦值
Python中夭咬,可以同時(shí)為多個(gè)變量賦值:
aa = bb = cc = 11
這個(gè)例子的含義為啃炸,創(chuàng)建一個(gè)整型對(duì)象,值為11卓舵,從后向前賦值南用,3個(gè)變量都指向同一個(gè)內(nèi)存地址。
再看一個(gè)例子:
dd, ee, ff = 22, 33, "GitOPEN"
這個(gè)例子中掏湾,將整型對(duì)象22
和33
分別分配給變量dd
和ee
裹虫,字符串對(duì)象GitOPEN
分配給變量ff
。
標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型
- Number(數(shù)字)── 不可變數(shù)據(jù)
- String(字符串)──不可變數(shù)據(jù)
- List(列表)──可變數(shù)據(jù)
- Tuple(元組)──不可變數(shù)據(jù)
- Set(集合)──可變數(shù)據(jù)
- Dictionary(字典)──可變數(shù)據(jù)
Number(數(shù)字)
Python3中的支持int融击、float筑公、bool、complex(復(fù)數(shù))
尊浪,在Python3中匣屡,只有一種整數(shù)類(lèi)型int
,表示為長(zhǎng)整型拇涤,沒(méi)有python2中的Long捣作。
示例:
In [3]: aa = 1111
In [4]: isinstance(aa, int)
Out[4]: True
數(shù)值運(yùn)算
# 加法運(yùn)算
In [5]: 11 + 11
Out[5]: 22
# 減法
In [6]: 5.21 - 5.20
Out[6]: 0.009999999999999787
# 減法
In [10]: 4.3 - 2
Out[10]: 2.3
# 取余
In [11]: 18 % 4
Out[11]: 2
# 乘方
In [12]: 2 ** 5
Out[12]: 32
# 除法,得到一個(gè)浮點(diǎn)數(shù)
In [13]: 2 / 4
Out[13]: 0.5
# 除法鹅士,得到一個(gè)整數(shù)
In [14]: 2 // 4
Out[14]: 0
# 除法券躁,得到一個(gè)整數(shù)
In [15]: 5 // 2
Out[15]: 2
- 注意:混合計(jì)算時(shí),Python會(huì)把整型轉(zhuǎn)換成為浮點(diǎn)數(shù)。
數(shù)值類(lèi)型實(shí)例
int | float | complex |
---|---|---|
10 | 0.0 | 3.14j |
100 | 15.20 | 45.j |
-786 | -21.9 | 9.322e-36j |
080 | 32.3e+18 | .876j |
-0490 | -90. | -.6545+0J |
-0x260 | -32.54e100 | 3e+26J |
0x69 | 70.2E-12 | 4.53e-7j |
浮點(diǎn)數(shù)誤差
先看一個(gè)例子:
In [24]: x = 4.20
In [25]: y = 2.10
In [26]: x + y
Out[26]: 6.300000000000001
In [27]: (x + y) == 6.3
Out[27]: False
In [28]: x = 1.2
In [29]: y = 2.3
In [30]: x + y
Out[30]: 3.5
In [31]: (x + y) == 3.5
Out[31]: True
產(chǎn)生上述問(wèn)題的原因嘱朽,就來(lái)自于浮點(diǎn)數(shù)計(jì)算精度問(wèn)題旭贬。
浮點(diǎn)數(shù)在計(jì)算機(jī)中表達(dá)為二進(jìn)制(binary)小數(shù),
例如搪泳,0.125
是1/10 + 2/100 + 5/100
的值;
又例如0.001
是0/2 + 0/4 + 1/8
的值扼脐。
這兩個(gè)數(shù)值相同岸军。唯一的實(shí)質(zhì)區(qū)別是第一個(gè)寫(xiě)為十進(jìn)制小數(shù)記法,第二個(gè)是二進(jìn)制瓦侮。
問(wèn)題就來(lái)了艰赞,大多數(shù)十進(jìn)制小數(shù)不能完全用二進(jìn)制小數(shù)來(lái)表示,導(dǎo)致的結(jié)果是肚吏,一般情況下方妖,你輸入的十進(jìn)制浮點(diǎn)數(shù),由實(shí)際存儲(chǔ)在計(jì)算機(jī)中的近似的二進(jìn)制浮點(diǎn)數(shù)表示罚攀。
這個(gè)問(wèn)題可以參見(jiàn)文檔《浮點(diǎn)數(shù)算法:爭(zhēng)議和限制》進(jìn)行詳細(xì)了解党觅。
浮點(diǎn)數(shù)誤差的解決方法
Python中的decimal模塊可以解決浮點(diǎn)數(shù)誤差的煩惱。這個(gè)模塊可以通過(guò)整數(shù)斋泄、字符串杯瞻、或者構(gòu)建decimal.Decimal對(duì)象,來(lái)解決這個(gè)問(wèn)題炫掐。如果是浮點(diǎn)數(shù)魁莉,因?yàn)楦↑c(diǎn)數(shù)本身存在誤差,在計(jì)算前需要先將浮點(diǎn)數(shù)轉(zhuǎn)化為字符串募胃。
示例:
In [32]: from decimal import Decimal
In [33]: from decimal import getcontext
In [34]: Decimal('4.20') + Decimal('2.10')
Out[34]: Decimal('6.30')
In [35]: x = 4.20
In [36]: y = 2.10
In [37]: z = Decimal(str(x)) + Decimal(str(y))
In [38]: z
Out[38]: Decimal('6.3')
# 設(shè)置精度
In [39]: getcontext().prec = 4
In [40]: Decimal('1.00') / Decimal('3.0')
Out[40]: Decimal('0.3333')
- 注意旗唁,精度提升的同時(shí),會(huì)伴隨性能的損失痹束。在對(duì)數(shù)據(jù)要求特別高的場(chǎng)景下检疫,例如財(cái)務(wù)計(jì)算等,性能的損失是值得的参袱。
String(字符串)
在Python中电谣,字符串用單引號(hào)'
或者雙引號(hào)"
括起來(lái),如果遇到特殊字符抹蚀,可以用反斜杠\
進(jìn)行轉(zhuǎn)義剿牺。
字符串截取的用法示例:
In [41]: aa = '我愛(ài)學(xué)習(xí)'
In [42]: bb = '我是張學(xué)友的粉絲'
In [44]: aa[1:3]
Out[44]: '愛(ài)學(xué)'
In [45]: aa[1:4]
Out[45]: '愛(ài)學(xué)習(xí)'
In [47]: bb[-6:-1]
Out[47]: '張學(xué)友的粉'
In [48]: bb[-7:-1]
Out[48]: '是張學(xué)友的粉'
加號(hào)+
是字符串的連接符,星號(hào)*
表示復(fù)制當(dāng)前字符串多少次:
In [50]: aa + "," + bb
Out[50]: '我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲'
In [51]: (aa + "," + bb + "环壤。") * 10
Out[51]: '我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲晒来。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲郑现。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲湃崩。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲荧降。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲攒读。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲朵诫。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲薄扁。'
我們有這樣一個(gè)字符串GitOPEN\niubi
剪返,看一下下面的操作:
In [53]: cc = "GitOPEN\niubi"
In [54]: print(cc)
GitOPEN
iubi
In [55]: dd = r"GitOPEN\niubi"
In [56]: print(dd)
GitOPEN\niubi
如果字符串本身有特殊字符,但是想讓字符串中的特殊字符不轉(zhuǎn)義邓梅,那么在字符串前面加上r
脱盲,表示按照原始字符串進(jìn)行輸出。
List(列表)
List可以說(shuō)是Python中使用最頻繁的數(shù)據(jù)類(lèi)型日缨。列表中的元素類(lèi)型可以不相同钱反,它支持?jǐn)?shù)字,字符串甚至可以列表嵌套匣距。
下面是列表面哥,列表截取操作,列表排序操作:
In [57]: a_list = ['aa', 'bb', 'cc', 'dd', 'ee']
In [58]: b_list = [11, 22, 33.22, 44.05]
In [59]: print(a_list[1])
bb
In [60]: print(a_list[1:3])
['bb', 'cc']
In [61]: print(a_list[2:])
['cc', 'dd', 'ee']
In [62]: print(b_list)
[11, 22, 33.22, 44.05]
# reverse = False表示升序墨礁,這是默認(rèn)值
In [64]: b_list.sort(reverse=False)
In [65]: print(b_list)
[11, 22, 33.22, 44.05]
# reverse = True表示降序
In [66]: b_list.sort(reverse=True)
In [67]: print(b_list)
[44.05, 33.22, 22, 11]
Tuple(元組)
Python中幢竹,元組是用()
括起來(lái)的,元素不能修改恩静。
a_tup = ('鋤禾','日','當(dāng)午')
b_tup = (1, 2, 3, 4, 5)
c_tup = "a", "b", "c", "d"
# 創(chuàng)建空元組
d_tup = ()
# 元組中只有一個(gè)元素時(shí)焕毫,需要在元素后面添加逗號(hào)
e_tup = (50,)
f_tup = a_tup + b_tup
print(f_tup)
# 刪除元組
del f_tup
print(f_tup)
元組內(nèi)置函數(shù)
Python元組包含了以下內(nèi)置函數(shù):
序號(hào) | 方法及描述 |
---|---|
1 |
cmp(tuple1, tuple2) 比較兩個(gè)元組元素。 |
2 |
len(tuple) 計(jì)算元組元素個(gè)數(shù)驶乾。 |
3 |
max(tuple) 返回元組中元素最大值邑飒。 |
4 |
min(tuple) 返回元組中元素最小值。 |
5 |
tuple(seq) 將列表轉(zhuǎn)換為元組级乐。 |
Dictionary(字典)
Python中的字典另一種可變?nèi)萜髂P透硐蹋梢源鎯?chǔ)任意類(lèi)型對(duì)象。
鍵值對(duì)的鍵和值用:
冒號(hào)分割风科,每個(gè)鍵值對(duì)用,
逗號(hào)分割撒轮;鍵是唯一的,值不需要唯一贼穆,如果鍵重復(fù)题山,那么最后一個(gè)鍵值對(duì)會(huì)覆蓋前面的。
In [69]: a_dict = {'a':'1', 'b':'2', 'c':'3', 'b':'4'}
# 取值
In [70]: a_dict['b']
Out[70]: '4'
In [71]: a_dict
Out[71]: {'a': '1', 'b': '4', 'c': '3'}
# 更新值
In [72]: a_dict['a'] = 11
In [73]: a_dict
Out[73]: {'a': 11, 'b': '4', 'c': '3'}
# 刪除某個(gè)鍵對(duì)應(yīng)的值
In [74]: del a_dict['c']
In [75]: a_dict
Out[75]: {'a': 11, 'b': '4'}
# 清空字典中所有的值
In [76]: a_dict.clear()
In [77]: a_dict
Out[77]: {}
# 刪除字典
In [78]: del a_dict
In [79]: a_dict
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-79-374973eefd04> in <module>()
----> 1 a_dict
NameError: name 'a_dict' is not defined
字典中鍵的特性
- 同一個(gè)鍵不允許出現(xiàn)兩次故痊。創(chuàng)建時(shí)如果同一個(gè)鍵被賦值兩次顶瞳,后一個(gè)值會(huì)被記住。
- 鍵必須是不可變數(shù)據(jù)類(lèi)型,可以用數(shù)字慨菱、字符串焰络、元組,但是列表就不行符喝。
字典的內(nèi)置函數(shù)
序號(hào) | 函數(shù)及描述 |
---|---|
1 |
cmp(dict1, dict2) 比較兩個(gè)字典元素闪彼。 |
2 |
len(dict) 計(jì)算字典元素個(gè)數(shù),即鍵的總數(shù)协饲。 |
3 |
str(dict) 輸出字典可打印的字符串表示备蚓。 |
4 |
type(variable) 返回輸入的變量類(lèi)型,如果變量是字典就返回字典類(lèi)型囱稽。 |
字典的內(nèi)置方法
序號(hào) | 函數(shù)及描述 |
---|---|
1 |
dict.clear() 刪除字典內(nèi)所有元素 |
2 |
dict.copy() 返回一個(gè)字典的淺復(fù)制 |
3 |
dict.fromkeys(seq[, val]) 創(chuàng)建一個(gè)新字典,以序列 seq 中元素做字典的鍵二跋,val 為字典所有鍵對(duì)應(yīng)的初始值 |
4 |
dict.get(key, default=None) 返回指定鍵的值战惊,如果值不在字典中返回default值 |
5 |
dict.has_key(key) 如果鍵在字典dict里返回true,否則返回false |
6 |
dict.items() 以列表返回可遍歷的(鍵, 值) 元組數(shù)組 |
7 |
dict.keys() 以列表返回一個(gè)字典所有的鍵 |
8 |
dict.setdefault(key, default=None) 和get() 類(lèi)似, 但如果鍵不存在于字典中扎即,將會(huì)添加鍵并將值設(shè)為default |
9 |
dict.update(dict2) 把字典dict2的鍵/值對(duì)更新到dict里 |
10 |
dict.values() 以列表返回字典中的所有值 |
11 |
pop(key[,default]) 刪除字典給定鍵 key 所對(duì)應(yīng)的值吞获,返回值為被刪除的值。key值必須給出谚鄙。 否則各拷,返回default值。 |
12 |
popitem() 隨機(jī)返回并刪除字典中的一對(duì)鍵和值闷营。 |
函數(shù)
函數(shù)是組織好的烤黍,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一或者相關(guān)功能的代碼段傻盟。它能夠提高應(yīng)用的模塊性速蕊,以及代碼的重復(fù)利用率。我們已經(jīng)使用過(guò)很多內(nèi)建函數(shù)娘赴,比如print()
规哲,但是,也可以創(chuàng)建用戶(hù)自定義函數(shù)诽表。
定義一個(gè)函數(shù)
定義一個(gè)函數(shù)非常簡(jiǎn)單唉锌,它有幾個(gè)規(guī)則:
- 函數(shù)以
def
關(guān)鍵字開(kāi)頭,后接函數(shù)名稱(chēng)和():
- 傳入?yún)?shù)和自變量必須放在
()
內(nèi) - 函數(shù)代碼塊的內(nèi)部第一行可以使用文檔字符串進(jìn)行函數(shù)說(shuō)明
-
return [表達(dá)式]
用來(lái)結(jié)束函數(shù)竿奏,選擇是否返回值給調(diào)用者袄简,不帶表達(dá)式的return
相當(dāng)于返回None
示例:
def sayhello(text):
"""
這是一個(gè)說(shuō)你好的函數(shù)
:param text: 打招呼內(nèi)容
:return: 返回打招呼內(nèi)容
"""
result = "你好," + text
return result
sayhelllo('世界')
參數(shù)
參數(shù)類(lèi)型:
- 必備參數(shù)
- 關(guān)鍵字參數(shù)
- 默認(rèn)參數(shù)
- 不定長(zhǎng)參數(shù)
必備參數(shù)
必備參數(shù)必須以正確的順序傳入函數(shù)议双,調(diào)用的時(shí)候痘番,數(shù)量必須和聲明的一樣。
def printtext(text):
print(text)
return;
printtext('你好,世界')
# 報(bào)錯(cuò) TypeError: printtext() missing 1 required positional argument: 'text'
printtext()
關(guān)鍵字參數(shù)
使用關(guān)鍵字參數(shù)允許函數(shù)在調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致汞舱。
def printmsg(text1, text2):
print('text1是:', text1)
print('text2是:', text2)
return
printmsg(text2='世界', text1='你好')
缺省參數(shù)
調(diào)用函數(shù)時(shí)伍纫,如果缺省參數(shù)的值沒(méi)有傳入,那么會(huì)使用默認(rèn)值昂芜。
def printemployee(uid, name, salary=1000.00):
print('Uid:', uid)
print('Name:', name)
print('Salary:', salary)
return
printemployee('001', '張1', 2000.00)
printemployee('002', '張2')
不定長(zhǎng)參數(shù)
有的時(shí)候莹规,我們需要一個(gè)函數(shù),它能夠處理比當(dāng)初聲明時(shí)更多的參數(shù)泌神,這些參數(shù)叫做不定長(zhǎng)參數(shù)良漱。加了星號(hào)(*)的變量名會(huì)存放所有未命名的變量參數(shù)。
def printinfo(arg1, *args):
print('輸出參數(shù):')
print('arg1:', arg1)
for arg in args:
print('arg', arg)
return
printinfo(1, 2)
printinfo(3, 4, 5, 6)
匿名函數(shù)
創(chuàng)建匿名函數(shù)的方法是使用lambda
欢际。
示例:
sum = lambda x, y: x + y
print(sum(1, 2))
全局變量和局部變量
定義在函數(shù)內(nèi)部的是局部變量母市,擁有局部作用域;定義在函數(shù)外的變量是全局變量损趋,擁有全局作用域患久。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱(chēng)都將被加入到作用域中浑槽。
示例:
# 全局變量
total = 0
def sum(x, y):
total = x + y
print('函數(shù)內(nèi)是局部變量:', total)
return total
sum(11, 22)
print('函數(shù)外是全局變量:', total)
命名空間和作用域
變量就是一個(gè)名字(標(biāo)識(shí)符)蒋失,它指向了對(duì)象。命名空間是一個(gè)字典桐玻,它的鍵是變量名稱(chēng)篙挽,對(duì)應(yīng)的值是對(duì)象。
Python表達(dá)式可以訪問(wèn)局部命名空間和全局命名空間里面的變量镊靴。如果一個(gè)局部變量和一個(gè)全局變量重名铣卡,則局部變量會(huì)覆蓋全局變量。
每一個(gè)函數(shù)都有自己的命名空間邑闲,類(lèi)的方法的作用域的規(guī)則和一般的函數(shù)一樣算行。Python會(huì)智能地猜測(cè)變量是局部還是全局的,并且假設(shè)在函數(shù)內(nèi)賦值的變量都是局部的苫耸。
面向?qū)ο缶幊?/h2>
Python是一門(mén)面向?qū)ο笳Z(yǔ)言州邢,因此在Python中創(chuàng)建類(lèi)和對(duì)象是輕而易舉的事情。
面向?qū)ο蠛?jiǎn)介
概念 | 含義 |
---|---|
類(lèi)褪子,Class | 類(lèi)是一個(gè)集合量淌,描述了具有相同的屬性和方法的對(duì)象 |
實(shí)例化 | 就是創(chuàng)建類(lèi)的實(shí)例,類(lèi)的具體對(duì)象 |
類(lèi)變量 | 在實(shí)例化對(duì)象中嫌褪,類(lèi)變量是公用的呀枢;類(lèi)變量定義在類(lèi)內(nèi)部并且在函數(shù)體之外 |
數(shù)據(jù)成員 | 類(lèi)變量或者實(shí)例變量,用于處理類(lèi)及其實(shí)例對(duì)象的相關(guān)的數(shù)據(jù) |
繼承 | 派生類(lèi)繼承基類(lèi)(父類(lèi))的字段和方法笼痛。允許把一個(gè)派生類(lèi)對(duì)象作為父類(lèi)對(duì)象對(duì)待裙秋。 |
方法重寫(xiě) | 子類(lèi)從父類(lèi)繼承過(guò)來(lái)的方法琅拌,不能滿(mǎn)足子類(lèi)的需求,可以對(duì)其進(jìn)行重寫(xiě)(override) |
方法 | 類(lèi)中的函數(shù) |
對(duì)象 | 類(lèi)的實(shí)例摘刑,包括兩個(gè)數(shù)據(jù)成員(類(lèi)變量进宝、實(shí)例變量)和方法 |
實(shí)例變量 | 定義在方法中的變量 |
創(chuàng)建類(lèi)
示例:
class Employee:
count = 0
def __init__(self, name, age):
self.name = name
self.age = age
Employee.count += 1
def print_count(self):
print("員工總數(shù)為:{}".format(Employee.count))
def show_info(self):
print("Name:{},Age:{}".format(self.name, self.age))
def prt(self):
print(self)
print(self.__class__)
-
count
是一個(gè)類(lèi)變量,它的值在這個(gè)類(lèi)的實(shí)例對(duì)象之間共享枷恕。 -
__init__()
方法是一個(gè)特殊的方法党晋,叫做類(lèi)的構(gòu)造函數(shù)或者初始化方法,當(dāng)實(shí)例化該類(lèi)的對(duì)象時(shí)就會(huì)調(diào)用這個(gè)方法 -
self
代表類(lèi)的實(shí)例徐块,在定義類(lèi)的方法時(shí)是必須的未玻,但在調(diào)用時(shí)不必傳入相應(yīng)的參數(shù) - 類(lèi)的方法與普通的函數(shù)只有一個(gè)區(qū)別,它必須有一個(gè)額外的第一個(gè)參數(shù)名稱(chēng)胡控,按照習(xí)慣昼激,它的名稱(chēng)是
self
# 實(shí)例化對(duì)象
emp1 = Employee('張三', 18)
# 對(duì)象調(diào)用方法
emp1.print_count()
emp1.show_info()
emp2 = Employee('張四', 17)
emp2.print_count()
emp2.show_info()
# self是類(lèi)的實(shí)例,代表當(dāng)前對(duì)象的地址癣猾;self.__class__指向類(lèi)纷宇。
emp1.prt()
打印的結(jié)果為:
員工總數(shù)為:1
Name:張三,Age:18
員工總數(shù)為:2
Name:張四,Age:17
<__main__.Employee object at 0x1120564a8>
<class '__main__.Employee'>
一些訪問(wèn)屬性的函數(shù):
函數(shù) | 含義 |
---|---|
getattr(obj, name[,default]) |
訪問(wèn)對(duì)象的屬性 |
hasattr(obj,name) |
檢查是否存在一個(gè)屬性 |
setattr(obj,name,value) |
設(shè)置一個(gè)屬性,如果屬性不存在蛾方,則創(chuàng)建一個(gè)新屬性 |
delattr(obj,name) |
刪除屬性 |
內(nèi)置類(lèi)屬性
名稱(chēng) | 含義 |
---|---|
__dict__ |
類(lèi)的屬性拓春,包含一個(gè)字典硼莽,由類(lèi)的數(shù)據(jù)屬性組成 |
__doc__ |
類(lèi)的文檔字符串 |
__name__ |
類(lèi)名 |
__module__ |
類(lèi)所在的模塊懂鸵,全名為__main__className
|
__bases__ |
類(lèi)的所有父類(lèi)構(gòu)成元素,包含一個(gè)由所有父類(lèi)組成的元組 |
示例:
print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)
輸出:
Employee.__doc__:
員工基類(lèi)
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {'__module__': '__main__', '__doc__': '\n 員工基類(lèi)\n ', 'count': 2, '__init__': <function Employee.__init__ at 0x105180268>, 'print_count': <function Employee.print_count at 0x1051802f0>, 'show_info': <function Employee.show_info at 0x105180378>, 'prt': <function Employee.prt at 0x105180400>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>}
類(lèi)的繼承
代碼重用是面向?qū)ο缶幊處?lái)的主要好處之一终息,實(shí)現(xiàn)重用的方法之一就是繼承機(jī)制柳譬。
示例:
class Parent:
parent_attr = 123
def __init__(self):
print("Parent構(gòu)造函數(shù)")
def parentMethod(self):
print("Parent方法")
def setAttr(self, attr):
Parent.parent_attr = attr
def getAttr(self):
print("父類(lèi)屬性:", Parent.parent_attr)
class Child(Parent):
def __init__(self):
print("子類(lèi)構(gòu)造函數(shù)")
def childMethod(self):
print("Child方法")
child1 = Child()
child1.childMethod()
child1.parentMethod()
child1.setAttr(456)
child1.getAttr()
輸出:
子類(lèi)構(gòu)造函數(shù)
Child方法
Parent方法
父類(lèi)屬性: 456
方法重載
如果父類(lèi)的方法的功能不能滿(mǎn)足你的需求征绎,在子類(lèi)中可以重寫(xiě)父類(lèi)的方法人柿。
示例:
class A:
def myMethod(self):
print("父類(lèi)方法")
class B(A):
def myMethod(self):
print("子類(lèi)方法")
b = B()
b.myMethod()
time模塊、datetime模塊哥放、json模塊甥雕、csv模塊使用方法
time 模塊
在編寫(xiě)Python程序時(shí),轉(zhuǎn)換日期時(shí)間是一個(gè)常見(jiàn)的功能峭弟。時(shí)間間隔是以秒為單位的浮點(diǎn)小數(shù)瞒瘸。每個(gè)時(shí)間戳都以自從1970年1月1日午夜(歷元)經(jīng)過(guò)了多長(zhǎng)時(shí)間來(lái)表示。
獲取當(dāng)前時(shí)間戳:
import time
ticks = time.time()
print("當(dāng)前的時(shí)間戳為:{}".format(ticks))
時(shí)間元組
struct_time元組谎柄,具有如下屬性:
序號(hào) | 字段 | 屬性 | 值 |
---|---|---|---|
0 | 4位年 | tm_year | 2018 |
1 | 月 | tm_mon | 1到12 |
2 | 日 | tm_mday | 1到31 |
3 | 小時(shí) | tm_hour | 0到23 |
4 | 分鐘 | tm_min | 0到59 |
5 | 秒 | tm_sec | 0到61(60或61是潤(rùn)秒) |
6 | 一周的第幾日 | tm_wday | 0到6(0是周一) |
7 | 一年的第幾日 | tm_yday | 1到366 |
8 | 夏令時(shí) | tm_isdst | -1, 0, 1, -1是決定是否為夏令時(shí)的旗幟 |
獲取當(dāng)前時(shí)間
import time
localtime = time.localtime(time.time())
print("當(dāng)前本地時(shí)間為:{}".format(localtime))
輸出為:
當(dāng)前本地時(shí)間為:time.struct_time(tm_year=2018, tm_mon=8, tm_mday=13, tm_hour=21, tm_min=49, tm_sec=53, tm_wday=0, tm_yday=225, tm_isdst=0)
格式化時(shí)間
import time
localtime = time.asctime(time.localtime(time.time()))
print("格式化后的時(shí)間為:{}".format(localtime))
輸出:
格式化后的時(shí)間為:Mon Aug 13 21:52:20 2018
格式化日期
import time
# 格式化成2018-08-13 21:55:46形式
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 格式化成Mon Aug 13 21:52:20 2018形式
print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
# 將格式字符串轉(zhuǎn)換為時(shí)間戳
a = "Mon Aug 13 21:52:20 2018"
print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))
輸出:
2018-08-13 21:56:49
Mon Aug 13 21:56:49 2018
1534168340.0
datetime模塊
import datetime
i = datetime.datetime.now()
print("當(dāng)前的日期和時(shí)間是 %s" % i)
print("ISO格式的日期和時(shí)間是 %s" % i.isoformat())
print("當(dāng)前的年份是 %s" % i.year)
print("當(dāng)前的月份是 %s" % i.month)
print("當(dāng)前的日期是 %s" % i.day)
print("dd/mm/yyyy 格式是 %s/%s/%s" % (i.day, i.month, i.year))
print("當(dāng)前小時(shí)是 %s" % i.hour)
print("當(dāng)前分鐘是 %s" % i.minute)
print("當(dāng)前秒是 %s" % i.second)
json模塊
在使用Python進(jìn)行數(shù)據(jù)處理的過(guò)程中劈猿,我們經(jīng)常和json數(shù)據(jù)打交道揪荣。
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式仗颈。
json模塊的兩個(gè)常用函數(shù)為:
函數(shù)名 | 含義 |
---|---|
json.dumps |
將Python對(duì)象編碼成JSON字符串 |
json.loads |
將已編碼的JSON字符串解碼為Python對(duì)象 |
json.dumps
示例:
將Python對(duì)象(數(shù)組)編碼為JSON格式數(shù)據(jù):
import json
data = [{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}]
json_str = json.dumps(data)
print(json_str)
print(type(json_str))
格式化輸出JSON數(shù)據(jù):
data = {'name': 'GitOPEN', 'salary': 70000.01}
json_str = json.dumps(data, sort_keys=True, indent=4, separators=(', ', ': '))
print(json_str)
python 原始類(lèi)型向 json 類(lèi)型的轉(zhuǎn)化對(duì)照表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
json.loads
用于解碼JSON數(shù)據(jù),返回Python字段的數(shù)據(jù)類(lèi)型肆捕。
示例:
import json
json_str = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
text = json.loads(json_str)
print(type(text))
print(text)
csv模塊
csv庫(kù)可以幫助我們解決大多數(shù)CSV格式的數(shù)據(jù)讀寫(xiě)問(wèn)題。
讀數(shù)據(jù)
準(zhǔn)備一個(gè)csv格式的文件席纽,命名為data.csv
:
Uid,Name,Age,Score
1000,"張1",18,99.99
1001,"張2",19,89.99
1002,"張3",20,79.99
1003,"張4",21,69.99
示例:將這個(gè)數(shù)據(jù)文件讀取為一個(gè)元組序列:
import csv
with open('data.csv', 'r', encoding='utf-8') as f:
f_csv = csv.reader(f)
for row in f_csv:
print(row)
注意:data.csv和py文件的編碼格式應(yīng)當(dāng)統(tǒng)一為utf-8胆筒。
輸出為:
['Uid', 'Name', 'Age', 'Score']
['1000', '張1', '18', '99.99']
['1001', '張2', '19', '89.99']
['1002', '張3', '20', '79.99']
['1003', '張4', '21', '69.99']
示例:將這個(gè)數(shù)據(jù)讀取為一個(gè)字典:
import csv
with open('data.csv', 'r', encoding='utf-8') as f:
f_csv = csv.DictReader(f)
for row in f_csv:
print(type(row))
print(row)
輸出:
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1000'), ('Name', '張1'), ('Age', '18'), ('Score', '99.99')])
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1001'), ('Name', '張2'), ('Age', '19'), ('Score', '89.99')])
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1002'), ('Name', '張3'), ('Age', '20'), ('Score', '79.99')])
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1003'), ('Name', '張4'), ('Age', '21'), ('Score', '69.99')])
寫(xiě)數(shù)據(jù)
示例:
import csv
headers = ['Uid', 'Name', 'Age', 'Score']
rows = [
('1000', '張1', '18', '99.99'),
('1001', '張2', '19', '89.99'),
('1002', '張3', '20', '79.99'),
('1003', '張4', '21', '69.99')
]
with open('data1.csv', 'w', newline='') as f:
f_csv = csv.writer(f)
f_csv.writerow(headers)
f_csv.writerows(rows)
注意:
newline=''
這個(gè)參數(shù)矫渔,你會(huì)發(fā)現(xiàn)庙洼,如果不加油够,生成的csv文件中每一行下面總是會(huì)多一行空白行。
示例:
寫(xiě)入字典序列數(shù)據(jù)到csv文件中鬼悠。
import csv
headers = ['Uid', 'Name', 'Age', 'Score']
rows = [
{'Uid': 1000, 'Name': '張1', 'Age': 18, 'Score': 99.99},
{'Uid': 1001, 'Name': '張2', 'Age': 19, 'Score': 89.99},
{'Uid': 1002, 'Name': '張3', 'Age': 20, 'Score': 79.99},
{'Uid': 1003, 'Name': '張4', 'Age': 21, 'Score': 69.99}
]
with open('data2.csv', 'w', newline='') as f:
f_csv = csv.DictWriter(f, headers)
f_csv.writeheader()
f_csv.writerows(rows)
實(shí)戰(zhàn)──搜索引擎首頁(yè)實(shí)戰(zhàn)
寫(xiě)好的GitOPEN搜索首頁(yè)如圖所示:
整個(gè)項(xiàng)目的結(jié)構(gòu)如圖所示蹬挺,項(xiàng)目源碼位置CrawlerLessons/codes/lesson01/SearchDemo
:
index.html
源碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>GitOPEN搜索,最貼心搜索</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<div id="root">
<div id="header">
<div id="links">
<a target="_blank">新聞</a>
<a target="_blank">hao123</a>
<a target="_blank">地圖</a>
<a target="_blank">視頻</a>
<a href="table.html" target="_blank">員工</a>
<a href="list.html" target="_blank">列表</a>
</div>
</div>
<div id="content">
<img src="images/logo.png" alt="GitOPEN搜索,最貼心搜索">
<br>
<form action="https://www.so.com/s?" method="get">
<input id="input_search" type="text" name="q">
<input id="btn_search" type="submit" value="搜索一下"/>
</form>
</div>
<div id="footer">
Powered by GitOPEN ? Hosted by <a target="_blank">Vultr</a>
</div>
</div>
</body>
</html>
index.css
源碼:
* {
margin: 0px;
padding: 0px;
}
html, body {
width: 100%;
height: 100%;
}
#root {
width: 100%;
height: 100%;
align-self: center;
}
#header {
height: fit-content;
text-align: right;
}
#header #links {
padding: 10px;
}
#header #links a {
color: black;
font-size: 16px;
font-weight: bold;
margin-right: 16px;
}
#content {
height: 70%;
text-align: center;
padding-top: 60px;
}
#content img {
width: 300px;
}
#content #btn_search {
height: 34px;
width: 80px;
padding: 5px;
border: 0px;
background-color: #3D5984;
font-size: 16px;
color: #FFFFFF;
}
#content #input_search {
height: 34px;
width: 500px;
font-size: 18px;
border-color: #3D5984;
}
#footer {
height: 20%;
text-align: center;
font-style: oblique;
}
list.html
源碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>列表示例</title>
</head>
<body>
<h3>無(wú)序列表</h3>
<ul>
<li>張1</li>
<li>張2</li>
<li>張3</li>
<li>張4</li>
</ul>
<hr>
<h3>有序列表</h3>
<ol>
<li>張1</li>
<li>張2</li>
<li>張3</li>
<li>張4</li>
</ol>
</body>
</html>
table.html
源碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>員工信息</title>
<style>
table, th, td {
border: 1px #2d78f4 dashed;
border-collapse: collapse;
text-align: center;
}
table {
width: auto;
}
th, td {
width: 90px;
}
th {
color: crimson;
}
#total {
color: blueviolet;
}
</style>
</head>
<body>
<table>
<tr>
<th>編號(hào)</th>
<th>姓名</th>
<th>月薪</th>
</tr>
<tr>
<td>0001</td>
<td>張1</td>
<td>20000.00</td>
</tr>
<tr>
<td>0002</td>
<td>張2</td>
<td>10000.00</td>
</tr>
<tr>
<td>0003</td>
<td>張3</td>
<td>8000.00</td>
</tr>
<tr>
<td colspan="2">總計(jì)</td>
<td colspan="1" id="total">38000.00</td>
</tr>
</table>
</body>
</html>
實(shí)戰(zhàn)──簡(jiǎn)易學(xué)生管理系統(tǒng)
這是一個(gè)玩具代碼項(xiàng)目起愈,用來(lái)練習(xí)剛剛學(xué)會(huì)的Python基礎(chǔ)知識(shí)捏题。
這個(gè)實(shí)戰(zhàn)例子我們不再做代碼演示休涤,請(qǐng)大家自行運(yùn)行代碼功氨,找出代碼的不足之處捷凄,寫(xiě)出自己的《簡(jiǎn)易學(xué)生管理系統(tǒng)》,要求具有的功能如下圖所示:
參考代碼位置:CrawlerLessons/codes/lesson01/StudentSystem
桶错。