1. time模塊 import time *一*#時間戳--》結構化時間--》格式化的字元串時間 res1=time.localtime(654126574) print(res1 ) #res1 time.struct_time(tm_year=1990, tm_mon=9, tm_mday=2 ...
1. time模塊
import time
*一*#時間戳--》結構化時間--》格式化的字元串時間
-----------------------------------------------------------------------------
res1=time.localtime(654126574)
print(res1 )
#res1====time.struct_time(tm_year=1990, tm_mon=9, tm_mday=24, tm_hour=5, tm_min=49, tm_sec=34, tm_wday=0, tm_yday=267, tm_isdst=0)
-----------------------------------------------------------------------------
res2=time.strftime('%Y-%m-%d %H:%M:%S',res1)
print(res2)
#res2=====1990-09-24 05:49:34
----------------------------------------------------------------------------
*二*#格式化的字元串時間--》結構化時間--》時間戳
res1=time.strptime('1990-09-24 05:49:34','%Y-%m-%d %H:%M:%S')
print(res1)
#res1====time.struct_time(tm_year=1990, tm_mon=9, tm_mday=24, tm_hour=5, tm_min=49, tm_sec=34, tm_wday=0, tm_yday=267, tm_isdst=-1)
----------------------------------------------------------------------
res2=time.mktime(res1)
print(res2)
#res2=====654126574.0
三#時間加減
import datetime
print(datetime.datetime.now()) #返回系統當前時間格式為2021-08-16 15:11:49.477146
print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 2021-08-16
print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #當前時間-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #當前時間+3小時
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分
c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2)) #時間替換
2.radom模塊
import random
print(random.random())#(0,1)----float 大於0且小於1之間的小數
print(random.randint(1,3)) #[1,3] 大於等於1且小於等於3之間的整數
print(random.randrange(1,3)) #[1,3) 大於等於1且小於3之間的整數 顧頭不顧尾range
print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] 列表隨機選一個
print(random.sample([1,'23',[4,5]],2))#列表元素任意2個組合 列表隨機選倆
print(random.uniform(1,3))#大於1小於3的小數,如1.927109612082716
item=[1,3,5,7,9]
random.shuffle(item) #打亂item的順序,相當於"洗牌" 隨機排序
print(item)
####補充知識 print(ord(90))=Z 數字轉換阿斯克碼
# chr('A')字元轉換數字
#生成隨機數0-9或者A-Z
def make_radom(k):
dic=''
for i in range(k):
s1=str(random.randint(0,9))
s2=chr(random.randint(65,90))
dic += random.choice([s1,s2])
return dic
print(make_radom(4))
3.OS模塊
os.getcwd() #獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") #改變當前腳本工作目錄;相當於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字元串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印
os.remove() 刪除一個文件
os.rename("oldname","newname") 重命名文件/目錄
os.stat('path/filename') 獲取文件/目錄信息
os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用於分割文件路徑的字元串 win下為;,Linux下為:
os.name 輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command") 運行shell命令,直接顯示
os.environ 獲取系統環境變數
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。
即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False path可以是文件也可以是文件夾
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) #如果path是一個存在的文件,返回True。否則返回False path只可以是文件
os.path.isdir(path) #如果path是一個存在的目錄,則返回True。否則返回False path只可以是文件夾
os.path.join(path1[, path2[, ...]]) # 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
4.sys模塊
sys.argv #命令行參數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0)
sys.version 獲取Python解釋程式的版本信息
sys.maxint 最大的Int值
sys.path # 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回操作系統平臺名稱
5.shutil模塊
shutil.copyfileobj(fsrc, fdst[, length])
將文件內容拷貝到另一個文件中
import shutil
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
shutil.copyfile(src, dst)
拷貝文件
shutil.copyfile('f1.log', 'f2.log') #目標文件無需存在
shutil.copymode(src, dst)
僅拷貝許可權。內容、組、用戶均不變
shutil.copymode('f1.log', 'f2.log') #目標文件必須存在
shutil.copystat(src, dst)
僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目標文件必須存在
shutil.copy(src, dst)
拷貝文件和許可權
import shutil
shutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)
拷貝文件和狀態信息
import shutil
shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞歸的去拷貝文件夾
import shutil
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,
註意對folder2目錄父級目錄要有可寫許可權,ignore的意思是排除
拷貝軟連接
shutil.rmtree(path[, ignore_errors[, onerror]])
遞歸的去刪除文件
import shutil
shutil.rmtree('folder1')
shutil.move(src, dst)
遞歸的去移動文件,它類似mv命令,其實就是重命名。
import shutil
shutil.move('folder1', 'folder3')
壓縮打包文件
import shutil # 打包這個文件夾
ret = shutil.make_archive('./xxx', 'gztar', root_dir=r'G:\pycharmproject\ATM')
解壓
import tarfile
t=tarfile.open("xxx.tar.gz",'r') #解壓的文件
t.extractall(r'G:\pycharmproject\day14\aaa') #解壓完放在這
t.close()
6.json&pickle模塊
序列化
- 記憶體中的數據類型------序列化-------》格式
- 記憶體中的數據類型《------反序列化-------格式
作用:
- 存檔---》pickle
- 跨平臺交互數據---》json
# =====================================>json相容所有語言,但是不支持所有的python數據類型
#
# ====================> dumps--->loads
import json
str_json = json.dumps({"x":1,'y':2,'z':True,'a':None})
print(str_json) #{"x": 1, "y": 2, "z": true, "a": null}
dic = json.loads(str_json)
print(dic) #{'x': 1, 'y': 2, 'z': True, 'a': None}
# ====================> dump--->load
import json
dumps loads 操作的是字元串類型
直接寫到a.json裡面
json.dump({"x":1,'y':2,'z':True,'a':None},open('a.json',mode='wt',encoding='utf-8'))
讀出來一句話搞定
dic = json.load(open('a.json',mode='rt',encoding='utf-8'))
print(dic)
dump load 操作的是字典類型
=====================================> pickle只適用於python,但是可以支持所有python的數據類型
# ====================> dumps--->loads
import pickle
res_pkl = pickle.dumps({"x":1,'y':2,'z':True,'a':None})
print(res_pkl)
dic = pickle.loads(res_pkl)
print(dic)
# ====================> dump--->load
import pickle
pickle.dump({"x":1,'y':2,'z':True,'a':None},open('a.pkl',mode='wb'))
dic = pickle.load(open('a.pkl',mode='rb'))
print(dic)
import pickle
import json
# Python學習交流群:711312441
# res = pickle.dumps({1,2,3,4,5,6})
res = json.dumps({1,2,3,4,5,6})
print(res)
7. shelve模塊
shelve模塊比pickle模塊簡單,只有一個open函數,返回類似字典的對象,可讀可寫;key必須為字元串,而值可以是python所支持的數據類型
import shelve
f=shelve.open(r'sheve.txt')
# f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
# f['stu2_info']={'name':'gangdan','age':53}
# f['school_info']={'website':'http://www.pypy.org','city':'beijing'}
print(f['stu1_info']['hobby'])
f.close()
8.xml模塊
xml是實現不同語言或程式之間進行數據交換的協議,跟json差不多,但json使用起來更簡單,不過,古時候,在json還沒誕生的黑暗年代,大家只能選擇用xml呀,至今很多傳統公司如金融行業的很多系統的介面還主要是xml。
9. configparser模塊
[section1]
k1 = v1
k2:v2
user=egon
age=18
is_admin=true
salary=31
[section2]
k1 = v1
import configparser
config=configparser.ConfigParser()
config.read('a.cfg')
#查看所有的標題
res=config.sections() #['section1', 'section2']
print(res)
#查看標題section1下所有key=value的key
options=config.options('section1')
print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
#查看標題section1下所有key=value的(key,value)格式
item_list=config.items('section1')
print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
#查看標題section1下user的值=>字元串格式
val=config.get('section1','user')
print(val) #egon
#查看標題section1下age的值=>整數格式
val1=config.getint('section1','age')
print(val1) #18
#查看標題section1下is_admin的值=>布爾值格式
val2=config.getboolean('section1','is_admin')
print(val2) #True
#查看標題section1下salary的值=>浮點型格式
val3=config.getfloat('section1','salary')
print(val3) #31.0
#改寫
import configparser
config=configparser.ConfigParser()
config.read('a.cfg',encoding='utf-8')
#刪除整個標題section2
config.remove_section('section2')
#刪除標題section1下的某個k1和k2
config.remove_option('section1','k1')
config.remove_option('section1','k2')
#判斷是否存在某個標題
print(config.has_section('section1'))
#判斷標題section1下是否有user
print(config.has_option('section1',''))
#Python學習交流群:711312441
#添加一個標題
config.add_section('egon')
#在標題egon下添加name=egon,age=18的配置
config.set('egon','name','egon')
config.set('egon','age',18) #報錯,必須是字元串
#最後將修改的內容寫入文件,完成最終的修改
config.write(open('a.cfg','w'))
10. hashlib模塊
什麼叫hash:hash是一種演算法(3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法),該演算法接受傳入的內容,經過運算得到一串hash值
hash值的特點是:
- 只要傳入的內容一樣,得到的hash值必然一樣=====>要用明文傳輸密碼文件完整性校驗
- 不能由hash值返解成內容=======》把密碼做成hash值,不應該在網路傳輸明文密碼
- 只要使用的hash演算法不變,無論校驗的內容有多大,得到的hash值長度是固定的
11.suprocess模塊
import subprocess
#輸入cmd指令 stdout等於正確管道執行,stderr=錯誤管道執行
obj=subprocess.Popen("tasklist",shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
print(obj)
print(obj.stdout.read().decode('gbk')) #正確執行,都需要解碼指定gbk
print(obj.stderr.read().decode('gbk')) #錯誤執行,都需要解碼指定gbk
12.logging模塊
#level等級設置
CRITICAL = 50 #FATAL = CRITICAL
ERROR = 40
WARNING = 30 #WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0 #不設置
#字典裡面主要設置這幾個
logger:產生日誌的對象
Filter:過濾日誌的對象
Handler:接收日誌然後控制列印到不同的地方,FileHandler用來列印到文件中,StreamHandler用來列印到終端
Formatter對象:可以定製不同的日誌格式對象,然後綁定給不同的Handler對象使用,以此來控制不同的Handler的日誌格式
#formatters裡面的列印到屏幕或者文件設置的參數
%(name)s:Logger的名字,並非用戶名,詳細查看
%(levelno)s:數字形式的日誌級別
%(levelname)s:文本形式的日誌級別
%(pathname)s:調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s:調用日誌輸出函數的模塊的文件名
%(module)s:調用日誌輸出函數的模塊名
%(funcName)s:調用日誌輸出函數的函數名
%(lineno)d:調用日誌輸出函數的語句所在的代碼行
%(created)f:當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d:輸出日誌信息時的,自Logger創建以 來的毫秒數
%(asctime)s:字元串形式的當前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d:線程ID。可能沒有
%(threadName)s:線程名。可能沒有
%(process)d:進程ID。可能沒有
%(message)s:用戶輸出的消息
#在settings配置文件裡面配置
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'格式1': { #格式對象名字
'format': '%(asctime)s %(name)s %(filename)s:%(lineno)d %(levelname)s:%(message)s' #參數
},
'格式2': { #格式對象名字
'format': '%(asctime)s :%(message)s' #參數
},
},
'filters': {},
'handlers': {
'屏幕': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 列印到屏幕
'formatter': '格式2'
},
'文件': {
'level': 'DEBUG',
'class': 'logging.FileHandler', # 保存到文件
'formatter': '格式1',
'filename': DESC_dir,
'encoding': 'utf-8',
},
},
'loggers': {
# '交易日誌': {
# 'handlers': ['屏幕','文件'],
# 'level': 'DEBUG',
# 'propagate': False,
# },
'': { #不寫名字找不到的話就指定這個
'handlers': ['屏幕','文件'],
'level': 'DEBUG',
'propagate': False,
},
},
}
#在lib的common下重寫log方法
import logging.config
from conf import settings
logging.config.dictConfig(settings.LOGGING_DIC)#指定配置文件的字典
def log(msg,name,level='info'): #msg傳進來的文字,name=logger對象名字 level等級
logger = logging.getLogger(name) #獲取logger對象名字 拿著這個名字去配置文件尋找找不到用沒名字那個
if level == 'info':
logger.info(msg) #調方法
elif level == 'debug':
logging.debug(msg)
elif level == 'warn':
logger.warning(msg)
elif level == 'error':
logger.error(msg)
elif level == 'critical':
logger.critical(msg)