第五章 對象帶你飛

對象帶你飛

5.1 存儲

1. 文件

為了長期持續(xù)地存儲數(shù)據(jù),Python必須把數(shù)據(jù)以文件的方式存儲在磁盤中。Python借助文本對象來讀寫文件勃教。
內(nèi)置函數(shù)open()創(chuàng)建文件對象:


f = open(文件名,方式)


文件名是文件存在于磁盤的名字
方式:


"r" #讀取已經(jīng)存在的文件
"w" #新建文件并寫入
"a" #文件存在則寫入文件尾,不存在則新建并寫入


當(dāng)新建文件或者打開文件之后武鲁,可以對文件進行讀取:

s = f.read(4)        #讀取4個字節(jié)的數(shù)據(jù)
s = f.readline()     #讀取一行
s = f.readlines()    #讀取所有行蝠检,儲存在列表沐鼠,一行一個元素

當(dāng)以“w”或“a”的方式打開文件,我們可以對文件進行寫入文本,調(diào)用write()函數(shù)即可
Windows中的換行符是"\r\n"
UNIX中的換行符是"\n"
打開文件饲梭,讀取之后乘盖,記得調(diào)用close()函數(shù)關(guān)閉文件,以節(jié)省計算機資源占用憔涉。

2. 上下文管理器

上下文管理器用了with...as...結(jié)構(gòu)订框,其作用是通過縮進表明文件操作行為的起始與結(jié)束,它能自動關(guān)閉文件兜叨,而不需要f.close()屬性進行關(guān)閉穿扳,能讓程序員意識到那些階段文件需要打開進行操作。示例:

with open("hhh.txt","w") as f:
    f.write("hello国旷,world矛物!")

print(f.closed)                 #結(jié)果為True

上下文管理器基于對象的_exit_()特殊方法,當(dāng)使用上下文管理器語法時跪但,就會自動調(diào)用文件對象的_enter_()和_exit_()方法履羞,一個是程序塊開始之前調(diào)用,一個是結(jié)束時調(diào)用屡久。

3.pickle包

對于文本忆首,我們能夠進行文件存儲,而對象的存儲我們則要使用pickle包進行序列化再將其存儲于文件中進行保留涂身。如何對敵雄卷?如下:

import pickle
class Bird(object):
    have_feather = True
    reproduction_method = "egg"

summer = Bird()
with open("summer.pkl","w") as f:
    pickle.dump(summer,f)      #序列化對象且保存

dump()函數(shù)是用以序列化的。
以上是對象的存儲蛤售,下面講對象的讀取丁鹉,它們的過程剛好相反。步驟是:
1悴能、從文件中讀取文本
2揣钦、用pickle的loads()方法將字符串形式的文本轉(zhuǎn)換為對象
注意,對象屬于類漠酿,先要有類的定義冯凹,才能夠讀取對象。

5.2 一寸光陰

1. time包

在硬件上炒嘲,計算機可以提供掛鐘時間宇姚,即從某個固定時間起點到現(xiàn)在的時間間隔。
所謂的處理器時間夫凸,即是當(dāng)CPU實際運行時浑劳,計算機測量的時間,以測量性能夭拌。
軟件上魔熏,我們現(xiàn)在通過Python編程來管理時間和日期衷咽。time包便提供了此類功能。整合如下:


time.time()??????#掛鐘時間蒜绽,單位為秒

time.clock()????#測量程序運行時間(首尾調(diào)用clock()方法圍住的程序的運行時間)Windows系統(tǒng)返回掛鐘時間镶骗,而UNIX返回的是處理器時間

time.sleep()????#讓程序休息,括號內(nèi)填秒數(shù)

time.gmtime()????#返回struct_time格式的UTC時間

time.localtime()????#返回struct_time格式的當(dāng)?shù)貢r間

time.mktime(st)????#將struct_time格式轉(zhuǎn)換為掛鐘時間

struct_time對象可以將掛鐘時間轉(zhuǎn)換為年躲雅、月鼎姊、日、時吏夯、分此蜈、秒等,并存儲在該對象的各個屬性中噪生。(tm_year裆赵、tm_mon、tm_today......)

2. datetime包

datetime包是time包的一個高級包跺嗽。即date + time = 年月日 + 時分秒毫秒战授。
于是datetime模塊分為time和date兩類。
datetime.datetime() #date類和time類一起使用
代表時間間隔的類:timedelta
一個時間間隔加上一個具體時間桨嫁,可以得到新的時間點植兰。
即調(diào)用timedelta()設(shè)定時間間隔(括號內(nèi)可設(shè)置秒、星期璃吧、天楣导、小時、毫秒畜挨、微妙)筒繁,再用其與先定義的datetime時間進行加減,即可得到新的時間點巴元。
兩個datetime對象之間還可以進行比較運算毡咏,以確定哪個時間更長。

3. 日期格式

不同時間信息的格式化:
%Y——年份
%m——月份
%d——日
%H——24小時制的小時
%M——分鐘
%S——秒
通過strptime()方法逮刨,將對應(yīng)的時間信息的格式化(用format進行定義)填入其中呕缭,就可以打印出相應(yīng)的格式。例如:

from datetime import datetime
str    =   "1999-10-31-140020"
format = "%Y-%m-%d-%H%M%S"
t      = datetime.strptime(str,format)
print(t)

strftime()方法可以將一個datetime對象轉(zhuǎn)換為特定格式字符串修己。

from datetime import datetime
format = "%Y-%m-%d,%H:%M:%S"
t      = datetime(2020,1,11,23,22,50)
print(t.strftime(format))

5.3 看起來像那樣的東西

1. 正則表達式 and 2.寫一個正則表達式

對于這里恢总,我認(rèn)為先學(xué)習(xí)正則表達式的書寫,了解正則表達式是什么睬愤,才去看格式應(yīng)用片仿,會比較好。那么何為正則表達式戴涝,顧名思義就是一種表達式,它可以用來達成某種目的,至于是什么目的啥刻,看下面:
正則表達式的常用語法:
.??????????????#任意一個字符
a | b????????#字符a或字符b
[afg]????????#a或f或g的一個字符
[0-4]???????#0-4范圍內(nèi)的一個字符
[a-f]????????#a-f范圍的一個字符
[^m]???????#不是m的一個字符
\s??????????#一個空格
\S???????#一個非空格
\d???????#一個數(shù)字即[0-9]
\D???????#一個非數(shù)字
\w???????#數(shù)字或字母
\W???????#非數(shù)字非字母
* ???????#重復(fù)超過0次
+???????#重復(fù)1次或超過1次
奸鸯????????#重復(fù)0或1次
{m}???????#重復(fù)m次
{m,n}???????#重復(fù)m到n次


由這些正則表達式的常用語法我們可以得知,正則表達式是用來規(guī)定某種或某些元素的出現(xiàn)形式和范圍的可帽,進而進行搜索并且可進行替換娄涩。
re包便是用來處理正則表達式的,簡單應(yīng)用:

import re
m = re.search("[0-9]","abcd4ef")
print(m.group(0))

除了search方法還有match方法映跟,它們的區(qū)別在于match必須從字符串的第一個字符就符合正則表達式蓄拣,否則返回None
對搜索到的字符串進行替換(sub方法):

str = re.sub(pattern, replacement, string)

其他方法:
re.split()?????????????????????????#根據(jù)正則表達式分割字符串,將生成的子字符串放在列表中返回
re.findall()??????? ??????????????#根據(jù)正則表達式搜索字符串努隙,將符合的子字符串放在列表中返回

3.進一步提取

對于搜索到的信息球恤,要進一步的提煉,就需要對正則表達式進行修改荸镊。例如:
對str="abcd_aesd_output_2020_asbf_1999_aaas"
"output_\d(4)"用search方法可以找到"output_2020",那如果我只想要2020這一數(shù)字結(jié)果咽斧,那就要進一步提取,于是我們在正則表達式中用括號括起來我們想要提取的部分躬存,目標(biāo)便可以被提取出來张惹。即output_(\d(4))。被括號括起來的部分我們稱之為“群”岭洲,一個正則表達式中可以有多個群宛逗。
對群的命名格式:?P<name>......
方便用group("name")進行調(diào)用

5.4 Python有網(wǎng)癮

1. HTTP通信

參與通信的個體總要遵守特定的協(xié)議,相當(dāng)于語法盾剩、規(guī)則雷激。HTTP協(xié)議是最常見的一種網(wǎng)絡(luò)協(xié)議,即超文本傳輸協(xié)議彪腔。其過程便是請求侥锦、回復(fù)

2. http.client包

Python是如何進行HTTP通信的呢德挣?其標(biāo)準(zhǔn)庫中有個http.client包恭垦,可以發(fā)出HTTP請求。示例:

import http.client
local = http.client.HTTPConnection("www.baidu.com")  #主機地址
local.request("GET","/")                             #請求方法和資源路徑
response = local.getresponse()                       #獲得回復(fù)

print(response.status,response.reason)               #回復(fù)的狀態(tài)碼和狀態(tài)描述
content = response.read()                            #回復(fù)的主體內(nèi)容
print(content)

5.5 寫一個爬蟲

根據(jù)前四個小節(jié)的內(nèi)容格嗅,就可以寫一個較為簡單的程序了番挺,以扒取網(wǎng)頁上的一些信息。
對于本書本章利用http.client包發(fā)送請求屯掖,扒取網(wǎng)頁信息玄柏,似乎不是太妥(按書本來,實現(xiàn)不了,是我太菜了)贴铜,若是針對只能用標(biāo)準(zhǔn)庫粪摘,我更傾向于使用urllib包瀑晒。所以我決定使用request庫獲取頁面信息然后用bs4進行提取:

import requests
import re
from bs4 import BeautifulSoup
def getHTMLText(url):
    try:
        a = requests.get(url, timeout = 20)
        a.raise_for_status()   #狀態(tài)碼不是200就會產(chǎn)生異常徘意,即請求得不到回應(yīng)
        a.encoding = 'gb2312'   #將字符編碼設(shè)置成'gb2312',根據(jù)網(wǎng)站所用的字符編碼修改苔悦,才能顯示出文本信息
        return a.text
    except:
        return "無法獲得信息"

def findHTMLText(text):
    soup    = BeautifulSoup(text,"html.parser") #返回BeautifulSoup對象
    return soup.find_all(string = re.compile(r"(.*分析):")) #通過正則表達式,實現(xiàn)字符串匹配


url = "http://www.southmoney.com/gupiao/scfx/"
text = getHTMLText(url)
r    = findHTMLText(text)
#以下是對提取的信息進行處理
ls = list(r)
ls = [i for i in ls if len(i) < 40 ]
mate = ''
for s in ls:
    mate = mate+s+'\n'
print(mate)

以上提取到的結(jié)果是:


美國非農(nóng)就業(yè)數(shù)據(jù)分析:2019年就業(yè)人數(shù)創(chuàng)8年新低 長期就業(yè)前景仍穩(wěn)健
A股市場行情分析:北上資金6個交易日凈流入超310億 周期股成新寵
乘用車市場分析:2019年狹義乘用車銷量減少7.4% 機構(gòu)預(yù)測進入短期底部
網(wǎng)紅經(jīng)濟市場分析:日出東方遭遇黑天鵝 網(wǎng)紅經(jīng)濟概念暫退燒
寵物行業(yè)市場分析:2019年吸金超22.37億元 食品椎咧、用品領(lǐng)域投資活躍
物流業(yè)市場分析:上月中國物流業(yè)景氣指數(shù)有所回落 但仍在高景氣區(qū)間
疫苗行業(yè)分析:國產(chǎn)PCV13獲批上市 接種人群較輝瑞沛兒13有所擴大
半導(dǎo)體行業(yè)市場分析:費城半導(dǎo)體指數(shù)年內(nèi)暴漲63% 十年翻了約十倍
醫(yī)藥研發(fā)行業(yè)分析:ADC藥物接連獲批上市 業(yè)內(nèi)紛紛加碼布局
券商股投資價值分析:中信證券成交破百億 打造航母級券商
豬肉行情分析:豬價較高峰下滑近兩成 生豬存欄量13個月來首次環(huán)比轉(zhuǎn)正
快遞行業(yè)分析:北京市快遞業(yè)價格行為規(guī)則出臺


書本上的不知道是不是我代碼打錯了玖详,樣例實現(xiàn)不了,枯了勤讽。(新手上路蟋座,大佬莫怪)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脚牍,隨后出現(xiàn)的幾起案子向臀,更是在濱河造成了極大的恐慌,老刑警劉巖莫矗,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飒硅,死亡現(xiàn)場離奇詭異,居然都是意外死亡作谚,警方通過查閱死者的電腦和手機三娩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妹懒,“玉大人雀监,你說我怎么就攤上這事≌;#” “怎么了会前?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匾竿。 經(jīng)常有香客問我瓦宜,道長,這世上最難降的妖魔是什么岭妖? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任临庇,我火速辦了婚禮,結(jié)果婚禮上昵慌,老公的妹妹穿的比我還像新娘假夺。我一直安慰自己,他們只是感情好斋攀,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布已卷。 她就那樣靜靜地躺著,像睡著了一般淳蔼。 火紅的嫁衣襯著肌膚如雪侧蘸。 梳的紋絲不亂的頭發(fā)上裁眯,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音讳癌,去河邊找鬼未状。 笑死,一個胖子當(dāng)著我的面吹牛析桥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艰垂,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泡仗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猜憎?” 一聲冷哼從身側(cè)響起娩怎,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胰柑,沒想到半個月后截亦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡柬讨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年崩瓤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踩官。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡却桶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔗牡,到底是詐尸還是另有隱情颖系,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布辩越,位于F島的核電站嘁扼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏黔攒。R本人自食惡果不足惜趁啸,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亏钩。 院中可真熱鬧莲绰,春花似錦、人聲如沸姑丑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栅哀。三九已至震肮,卻和暖如春称龙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戳晌。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工鲫尊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沦偎。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓疫向,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豪嚎。 傳聞我的和親對象是個殘疾皇子搔驼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 5.1 存儲 5.1.1 文件 內(nèi)存存儲:當(dāng)電腦斷電時,內(nèi)存中的數(shù)據(jù)就會消失侈询。另一方面舌涨,如果Python程序運行結(jié)...
    SibyLtuI閱讀 186評論 0 0
  • 一、存儲 .文本 扔字。Python中的數(shù)據(jù)都保存在內(nèi)存中囊嘉,內(nèi)存中的數(shù)據(jù)就會消失。而且革为,如果Python程序運行結(jié)束扭粱,...
    mAbbQi閱讀 423評論 0 1
  • 5.1儲存 1.文件 通過內(nèi)置函數(shù)open來創(chuàng)建文件對象 f=open(文件名,方式) 打開文件的常用方式P107...
    lammmya閱讀 115評論 0 0
  • 5.1 存儲 5.1.1 文件 ①打開 如果Python程序運行結(jié)束,那么分配給這個程序的內(nèi)存空間也會清空震檩。為了長...
    XavieR_ZzQ閱讀 139評論 0 0
  • 今天我和妹妹去打防疫針焊刹,妹妹沒有哭真勇敢,我要好好學(xué)習(xí)給妹妹做榜樣恳蹲。
    暖涵閱讀 182評論 0 0