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)不了,枯了勤讽。(新手上路蟋座,大佬莫怪)