首頁>技術>

一、常用內建模組

1、datetime

Python 提供了一個 time 和 calendar 模組可以用於格式化日期和時間

time.time():獲取當前時間戳的函式

時間戳:以自從1970年1月1日午夜(曆元)到此時此刻的秒數

1、獲取當前時間戳

import time

nowtime = time.time()

print(nowtime)

輸出:

1607673559.0851624

2、獲取當前日期和時間

datetime模組包含一個datetime類,透過from datetime import datetime匯入的才是datetime這個類

import time

from datetime import datetime

times = datetime.now()

print(times)

print(type(times))

輸出:

2020-12-11 16:45:44.246725

<class 'datetime.datetime'>

3、獲取指定日期和時間

指定某個日期和時間,我們直接用引數構造一個datetime

import time

from datetime import datetime

ktime = datetime(2020,12,11,16,50,49)

print(ktime)

輸出:

2020-12-11 16:50:49

4、datetime與timestamp的互相轉換

全球的timestamp是完全確定的

把datetime轉換為timestamp

datetime型別轉換為timestamp呼叫timestamp()方法

某些程式語言(如Java和JavaScript)的timestamp使用整數表示毫秒數,這種情況下只需要把timestamp除以1000就得到Python的浮點表示方法

import time

from datetime import datetime

dt = datetime(2020,12,11,17,00,26,56)

print(dt.timestamp())

輸出:

1607677226.000056

把datetime轉換為timestamp

timestamp轉換為datetime,使用datetime提供的fromtimestamp()方法

from datetime import datetime

t = 1429417200.0

print(datetime.fromtimestamp(t))

輸出:

2015-04-19 12:20:00

timestamp也可以直接被轉換到UTC標準時區的時間:

from datetime import datetime

t = 1429417200.0

print(datetime.fromtimestamp(t)) # 本地時間

2015-04-19 12:20:00

print(datetime.utcfromtimestamp(t)) # UTC時間

2015-04-19 04:20:00

5、str與datetime的互相轉換

str轉換為datetime

使用者輸入的日期和時間是字串,處理日期和時間,首先必須把str轉換為datetime,透過datetime.strptime()實現,日期和時間的格式化字串

字串’%Y-%m-%d %H:%M:%S’規定了日期和時間部分的格式

import time

from datetime import datetime

cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')

print(cday)

輸出:

2015-06-01 18:19:59

datetime轉換為str

datetime轉換為str是透過strftime()實現

import time

from datetime import datetime

now = datetime.now()

print(now.strftime('%a, %b, %d, %H:%M'))

輸出:

Sat, Dec, 12, 15:24

6、datetime加減

datetime的加減就是對日期和時間向前或向後計算的到新的datetime

datetime加減可以直接用+和-運算

import datetime

today = datetime.date.today()

print(today)

tomorrow = today + datetime.timedelta(days=1)

print(tomorrow)

輸出:

2020-12-12

2020-12-13

from datetime import datetime, timedelta

now = datetime.now()

print(now)

renow = now - timedelta(hours=18)

print(renow)

輸出:

2020-12-12 16:31:05.391746

2020-12-11 22:31:05.391746

7、本地時間裝換為UTC時間

UTC時間指UTC+0:00時區的時間

datetime型別有一個時區屬性tzinfo,預設為None導致無法區分這個datetime是哪個時區,可以給datetime加上時區

from datetime import datetime, timedelta, timezone

tz_utc_5 = timezone(timedelta(hours=5)) #建立時區UTC+5

now = datetime.now()

print(now)

dt = now.replace(tzinfo=tz_utc_5)

print(dt)

輸出:

2020-12-12 16:58:16.337391

2020-12-12 16:58:16.337391+05:00

8、時區轉換

時區轉換的關鍵在於,拿到一個datetime時,要獲知其正確的時區,然後強制設定時區

用帶時區的datetime,透過astimezone()方法,可以轉換到任意時區

from datetime import datetime, timedelta, timezone

utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)

print(utc_dt)

bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))

print(bj_dt)

2、collections

collections是Python內建的一個集合模組,提供了許多有用的集合類

1、namedtuple函式

namedtuple函式,它用來建立一個自定義的tuple物件,規定了tuple元素的個數,可以用屬性引用tuple的某個元素

namedtuple定義一種資料型別,它具備tuple的不變性,根據屬性來引用,使用十分方便

from collections import namedtuple

Point = namedtuple('point',['x', 'y'])

p = Point(1, 2)

print(p.x)

print(p.y)

print(isinstance(p, Point))

print(isinstance(p, tuple))

輸出:

1

2

True

True

2、deque雙向列表

from collections import deque

q = deque(['a', 'b', 'c'])

q.append('x')

q.appendleft('y')

print(q)

輸出:

deque(['y', 'a', 'b', 'c', 'x'])

3、defaultdict

正常訪問dict的key,當沒有該訪問的key時會報錯,這是用defaultdict就可以返回一個特定的值

注意預設值是呼叫函式返回的,而函式在建立defaultdict物件時傳入

from collections import defaultdict

dd = defaultdict(lambda : 'A/N')

dd['key1'] = 'abc'

print(dd['key1'])

print(dd['key2'])

輸出:

abc

A/N

4、OrderedDict

dict的key是無序的,在迭代dict時並不知道其順序,可以用OrderedDict保持其順序

OrderedDict的Key會按照插入的順序排列,不是Key本身排序

from collections import OrderedDict

d = dict([('a', 1), ('b', 2), ('c', 3)])

print(d)

od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

print(od)

od['z'] = 1

od['y'] = 2

od['x'] = 3

print(list(od.keys())) # 按照插入的Key的順序返回

輸出:

{'a': 1, 'b': 2, 'c': 3}

OrderedDict([('a', 1), ('b', 2), ('c', 3)])

['a', 'b', 'c', 'z', 'y', 'x']

from collections import OrderedDict

class LastUpdateOrderedDict(OrderedDict):

def __init__(self, capacity):

super(LastUpdateOrderedDict, self).__init__()

self._capacity = capacity

def __setitem__(self, key, value):

containsKey = 1 if key in self else 0

if len(self) - containsKey >= self._capacity:

last = self.popitem(last=False)

print('remove:',last)

if containsKey:

del self[key]

print('set:', (key, value))

else:

print('add:', (key, value))

OrderedDict.__setitem__(self, key, value)

5、ChainMap

ChainMap可以把一組dict串起來並組成一個邏輯上的dict

ChainMap本身也是一個dict,但是查詢的時候,會按照順序在內部的dict依次查詢

查詢user和color這兩個引數

from collections import ChainMap

import os, argparse

# 構造預設引數:

defaults = {

'color': 'red',

'user': 'guest'

}

# 構造命令列引數:

parser = argparse.ArgumentParser()

parser.add_argument('-u', '--user')

parser.add_argument('-c', '--color')

namespace = parser.parse_args()

command_line_args = { k: v for k, v in vars(namespace).items() if v }

# 組合成ChainMap:

combined = ChainMap(command_line_args, os.environ, defaults)

# 列印引數:

print('color=%s' % combined['color'])

print('user=%s' % combined['user'])

輸出:

(base) F:\pycharm\project>python test.py

color=red

user=guest

(base) F:\pycharm\project>python test.py -u yang

color=red

user=yang

(base) F:\pycharm\project>python test.py -u yang -c yellow

color=yellow

user=yang

6、counter

簡單的計數器

counter是一個dict

from collections import Counter

c = Counter()

for ch in 'programming':

c[ch] = c[ch]+1

print(c)

c.update('hello')

print(c)

輸出:

Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})

Counter({'r': 2, 'o': 2, 'g': 2, 'm': 2, 'l': 2, 'p': 1, 'a': 1, 'i': 1, 'n': 1, 'h': 1, 'e': 1})

3、base64方法

Base64是一種用64個字元來表示任意二進位制資料的方法,是一種最常見的二進位制編碼方法

一個包含64個字元的陣列

對二進位制資料進行處理,每3個位元組一組,一共是3x8=24bit,劃為4組,每組正好6個bit

得到4個數字作為索引,然後查表,獲得相應的4個字元,就是編碼後的字串

Python內建的base64可以直接進行base64的編解碼

import base64

print(base64.b64encode(b'binary\x00string'))

輸出:

b'YmluYXJ5AHN0cmluZw=='

標準的Base64編碼可能出現字元+和/,URL中不能直接作為引數,有一種"url

safe"的base64編碼,就是把字元+和/分別變成-和_

import base64

print(base64.b64encode(b'i\xb7\x1d\xfb\xef\xff'))

輸出:

b'abcd++//'

import base64

print(base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff'))

輸出:

b'abcd--__'

>

Base64是透過查表的編碼方法,不能用於加密,即使使用自定義的編碼表也不行

Base64適用於小段內容的編碼,比如數字證書籤名、Cookie的內容等

由於=字元可能出現在Base64編碼中,=用在URL、Cookie裡面會造成歧義,很多Base64編碼後會把=去掉

Base64是把3個位元組變為4個位元組,Base64編碼的長度永遠是4的倍數,需要加上=把Base64字串的長度變為4的倍數,才能正常解碼

4、struct

Python提供了一個struct模組來解決bytes和其他二進位制資料型別的轉換

struct的pack函式把任意資料型別變成bytes

表示位元組順序是big-endian,也就是網路序,I表示4位元組無符號整數

import struct

print(struct.pack('>I', 10240099))

輸出:

b'\x00\x9c@c'

unpack把bytes變成相應的資料型別

import struct

struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')

輸出:

(4042322160, 32896)

5、hashlib摘要演算法

Python的hashlib提供了常見的摘要演算法,如MD5,SHA1等等

摘要演算法又稱雜湊演算法、雜湊演算法:它透過一個函式,把任意長度的資料轉換為一個長度固定的資料串(通常用16進位制的字串表示)

摘要函式為單向函式,計算f(data)很容易,但透過digest反推data卻非常困難

摘要演算法MD5

MD5是最常見的摘要演算法,速度很快,生成結果是固定的128 bit位元組,通常用一個32位的16進位制字串表示

import hashlib

md5 = hashlib.md5()

md5.update('how to use md5 in python hashlib?'.encode('utf-8'))

print(md5.hexdigest())

print(len(md5.hexdigest()))

輸出:

d26a53750bc40b38b65a520292f69306

32

摘要演算法SHA1

SHA1的結果是160 bit位元組,通常用一個40位的16進位制字串

import hashlib

sha1 = hashlib.sha1()

sha1.update('how to use sha1 in '.encode('utf-8'))

sha1.update('python hashlib?'.encode('utf-8'))

print(sha1.hexdigest())

輸出:

2c76b57293ce30acef38d98f6046927161b46a44

6、itertools

Python的內建模組itertools提供了非常有用的用於操作迭代物件的函式

itertools提供的幾個“無限”迭代器

import itertools

natuals = itertools.count(1)

for n in natuals:

print(n)

輸出:

...

1

2

3

...

cycle()會把傳入的一個序列無限重複下去

import itertools

cs = itertools.cycle('ABC') # 注意字串也是序列的一種

for c in cs:

print(c)

輸出:

...

'A'

'B'

'C'

'A'

'B'

'C'

...

repeat()負責把一個元素無限重複下去,不過如果提供第二個引數就可以限定重複次數

import itertools

ns = itertools.repeat('A', 3)

for n in ns:

print(n)

輸出:

A

A

A

chain()可以把一組迭代物件串聯起來,形成一個更大的迭代器

import itertools

for c in itertools.chain('ABC', 'XYZ'):

print(c)

輸出:

A

B

C

X

Y

Z

groupby()把迭代器中相鄰的重複元素挑出來放在一起

import itertools

for key, group in itertools.groupby('AAABBBCCAAA'):

print(key, list(group))

輸出:

A ['A', 'A', 'A']

B ['B', 'B', 'B']

C ['C', 'C']

A ['A', 'A', 'A']

挑選規則是透過函式完成,作用於函式的兩個元素返回的值相等,這兩個元素就被認為是在一組,函式返回值作為組的key,忽略大小寫分組,可以讓元素’A’和’a’都返回相同的key

import itertools

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):

print(key, list(group))

輸出:

A ['A', 'a', 'a']

B ['B', 'B', 'b']

C ['c', 'C']

A ['A', 'A', 'a']

二、常用外接模組

1、requests

Python第三方庫requests比python的內建庫urllib處理URL資源更方便

1、使用requests

GET訪問一個頁面

當獲取的首頁亂碼時,可以用encoding/content設定解碼方式

import requests

r = requests.get('https://www.baidu.com/')

#用encoding解碼獲取的內容

r.encoding='utf-8' #設定編碼方式

print(r.encoding) #檢測編碼方式

print(r.status_code) #狀態碼判斷請求是否成功

print(r.text) #文字內容

print(r.url) #實際請求的url

#用content解碼獲取的內容

r.content.decode() #用content獲得bytes物件並用decode解碼

print(r.text)

可以用來判斷請求是否成功

assert response.status_code==(num)

檢視請求的響應頭以及相應的url

import requests

response = requests.get('https://www.sina.com')

print(response.headers)

print(response.request.url)

print(response.url)

可以構造正確的headers頭部,來請求網頁得到完整的頁面內容

import requests

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}

response = requests.get('https://www.baidu.com',headers = headers)

print(response.headers)

print(response.content.decode())

在requests中的response.requests.url的返回結果中存在url編碼,需要url解碼

import requests

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}

p = {'wd':'耐克'}

url_tem = 'https://www.baidu.com/s?'

r = requests.get(url_tem,headers = headers, params = p)

print(r.status_code)

print(r.request.url) #返回結果存在url編碼

print(r.content)

print(r.text)

爬取耐克百度貼吧的網頁資訊,並儲存到本地

import requests

class TiebaSpider:

def __init__(self,tiebaname):

self.tiebaname = tiebaname

self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}

self.url_temp = 'https://tieba.baidu.com/f?kw='+tiebaname+'&ie=utf-8&pn={}'

def get_url_list(self):

url_list =[]

for i in range(1000):

url_list.append(self.url_temp.format(i*50))

return url_list

def parse_url(self,url):

response = requests.get(url,headers = self.headers)

return response.content.decode()

def html_save(self,html_str,pagename):

file_path = '{}第{}頁.html'.format(self.tiebaname,pagename)

with open(file_path,'w',encoding='utf-8') as f:

f.write(html_str)

def run(self):

get_list = self.get_url_list()

for url in get_list:

html_str = self.parse_url(url)

pagename = get_list.index(url)+1

save = self.html_save(html_str,pagename)

if __name__ == '__main__':

tieba_spaider = TiebaSpider('耐克')

tieba_spaider.run()

19
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Day6 鴻蒙,如何使用Logger日誌工具做開發準備