python 常用標準庫
標準庫和第三方庫第一手資料:
線上: 官方文件(https://docs.python.org/)
離線:互動式直譯器(dir()、help()函式),IPython(tab鍵提示、?、??)
一、 日期和時間(https://docs.python.org/3/library/datetime.html)
datetime模組
date類-例項屬性:
year
month
day
time類-例項屬性:
hour
minute
second
microsecond
datetime類
date()例項方法->date物件
time()例項方法->time物件
now()類方法->datetime物件
strftime(str_format)例項方法->(datetime->str)
Y:4位年份
y:後2位年份
m:月份
d:日(月內第幾天)
H:小時(24小時制)
I:小時(12小時制)
M:分鐘
S:秒
f:微秒
strptime(dt_str, str_format)類方法->(str->datetime)
timedelta類(時間差,兩個datetime物件 相減 得到 timedelta物件)
days屬性
seconds屬性
microseconds屬性
total_seconds()方法
from datetime import datetime, timedelta
dt_begin = datetime.now() for i in range(10 ** 8): temp = 3.2 / 2.3 dt_end = datetime.now() dt_diff = dt_end - dt_begin print('花費 {0.seconds} 秒, {0.microseconds} 毫秒'.format(dt_diff)) |
time():時間戳(1970.01.01 00:00:00到現在經過的秒)
sleep(seconds):延時
calendar
setfirstweekday(weekday),設定每週的起始日期碼。0(星期一)到6(星期日)。
calendar(year,w=2,l=1,c=6):返回一個多行字串格式的year年年曆。
3個月一行,間隔距離為c。
每日寬度間隔為w字元。
每行長度為21* W+18+2* C。
l是每星期行數。
isleap(year):判斷閏年
weekday(year, month, day) :返回給定日期的星期日期碼
monthrange(year, month):返回給定月份的日期範圍(元組:(第一天的星期日期碼,月天數))
二、 資料格式
JSON:JavaScript物件表示法。(json在Python中叫做dict,在JS中叫做json)。
Json字串(str_obj):所有的字串只能用雙引號(")不能用單引號(')。
Json字串必須要有內容(len(str_obj) > 0),不能是空字串('')
json
load(fp):檔案物件->python內建物件
loads(str_obj):str->python內建物件(js:JSON.parse(str_obj))
object_pairs_hook,,控制資料如何轉換,是一個繼承自字典dict的類
dump(obj, fp):python內建物件->檔案物件
dumps(obj):python內建物件->str(js: JSON.stringify(obj, null, 4))
ensure_ascii: (預設值:True,會將CJK字元轉成Unicode嘛,以符合ASCII規範)。設定為False,可保證原樣輸出。
indent:(預設值:None,將會沒有縮排和多餘的空白輸出,全部擠到一行。)。除錯中,一般設定為4,和Python中風格一致。正式環境(比如web後端輸出),不需要縮排。
csv
writer(wfp) (寫入器) wfp: 可寫的檔案物件(open: newline)
writerow(list_obj)
writerows(2d_list_obj)
reader(rfp) (讀取器) rfp: 可讀的檔案物件
pickle
dump(obj, wfp):(obj -> wfp),無返回值
dumps(obj):(obj -> bytes),返回值bytes型別
load(rfp):(rfp -> obj),返回值為obj,開啟的必須是Python的pickle生成的檔案。
loads(bytes_obj):(bytes -> obj),返回值為obj,載入的必須是Python的pickle的位元組串,可以是dumps()方法生成的,也可以是從dump()方法生成的檔案中以二進位制方式讀取的。
說明:
obj為Python內建型別(list、dict、str等)物件
wfp為可寫的檔案物件
rfp為可讀的檔案物件
bytes為二進位制字串(位元組串)
三、 系統呼叫
os
getenv():獲取環境變數
putenv():設定環境變數
environ 從系統啟動時開始載入的環境變數(資料共享),dict相容型別,可修改。
注意: os._Environ中有一個字典,字典中儲存了環境變數,在Python程序啟動時,就會獲取系統中的環境變數,放入其中。
system():系統呼叫,需要傳遞一個必須的引數,字串型別。
sep:目錄分隔符(Windows: \, Linux和Max OS X: /)
linesep:行結束符(行分隔符)
sys
argv:命令列引數
path: Python中import時的搜尋路徑,list型別,可修改
modules:Python中已經載入了的模組,dict型別,可修改
stdin/stdout/stderr:標準 輸入、(正常)輸出、錯誤輸出
platform
platform():平臺
version():核心版本
architecture():CPU架構
machine():作業系統型別(I386,AMD64)。
node():本機網路名
processor():處理器資訊
system():系統(Windows)
uname():彙總資訊
python_version():Python版本
補充:
第三方-日期時間操作庫:python-dateutil
安裝:
pip install python-dateutil |
解析時間:
import dateutil.parser as dt_parser
dt_str = '2018-08-09 12:23:34' dt = dt_parser.parse(dt_str) |
第三方-資料操作庫:pandas
安裝:
pip install pandas |
解析時間:
import pandas as pd
csv_path = r'C:\User\XYZ\abc.csv' df = pd.read_csv(csv_path) |
標準庫-讀取json到有序字典:
import json from collections import OrderedDict
dict_obj = json.loads(str_data, object_pairs_hook=OrderedDict) |
Json擴充套件應用(豆瓣標籤爬蟲):
# -*- coding: utf-8 -*- import json
import requests
resp = requests.get('https://movie.douban.com/j/search_tags?type=movie&source=') if resp.ok: try: data = json.loads(resp.text) except Exception as e: print(e) else: print(data) else: print('請求失敗') |
bytes與str轉換:
bytes_obj. decode(encoding='utf-8', errors='strict') |
bytes.decode()引數:
encoding:指明位元組串是以哪種編碼儲存的。預設值為'utf-8'。
errors:如果出錯了,如何處理。可能的值為'strict'(嚴格處理,引發異常)、'ignore'(忽略,程式繼續)、'replace'(替換,程式繼續)。預設值為'strict'。
str.encode(=, ='strict')
encoding:指定了轉成哪種編碼。預設值為'utf-8'。
errors:如果出錯了,如何處理。預設值為'strict'。
chardet:第三方庫,專用於編碼判斷,使用步驟如下:
- 以二進位制方式讀取檔案,得到位元組串
- 呼叫chardet.detect()方法,引數為上一步得到的位元組串。
- 識別結果為字典型別,有一個名為'encoding',就是識別到的編碼。但是,有可能判斷失敗,所以需要判斷結果是否有效。
chardet示例程式碼
# -*- coding: utf-8 -*- # 模組倒入 try: import chardet except ImportError: # 如果匯入第三方庫出錯,一般是未安裝 # 呼叫pip安裝 import os os.system('pip install chardet') # 安裝完成後重新匯入 import chardet
# 要判斷編碼的內容 bys = b'hehe' # 判斷編碼 det = chardet.detect(bys) # 獲取編碼 encoding = 'None' # 可能檢測失敗,需要判斷 if isinstance(det, dict) and 'encoding' in det: encoding = det['encoding'] # 如果獲取到了編碼 if bool(encoding): # TODO:得到編碼後做的事,以下是示例 # 就算正確得到了編碼,也要防止存在不可解碼的字元 # 所以需要設定errors引數值為'ignore'或'replace',一般用前者 str_obj = bys.decode(encoding, errors='ignore') print(str_obj) # TODO: 對字串操作 pass else: print('編碼檢測失敗,請手動處理') |