1赊舶,time 和 datetime 模塊
import time
# 時(shí)間戳(1970年1月1日淤刃,秒計(jì)算)
>>> print(time.time())
1629797436.9953249
>>> print(time.strftime("%Y-%m-%d %X"))
2021-08-24 17:32:43
import datetime
>>> print(datetime.datetime.now())
2021-08-24 17:25:27.262004
>>> print(datetime.date.fromtimestamp(time.time()) )
2021-08-24
# 當(dāng)前時(shí)間+3天
>>> print(datetime.datetime.now() + datetime.timedelta(3))
2021-08-27 17:34:20.375315
# 當(dāng)前時(shí)間-3天
>>> print(datetime.datetime.now() + datetime.timedelta(-3))
2021-08-21 17:35:27.432718
# 當(dāng)前時(shí)間往后+3小時(shí)(往后倒3小時(shí)則負(fù)數(shù)-3表示)
>>> print(datetime.datetime.now() + datetime.timedelta(hours=3))
2021-08-24 20:36:12.993908
# 當(dāng)前時(shí)間往后+30分鐘(往后倒30分鐘則負(fù)數(shù)-30表示)
>>> print(datetime.datetime.now() + datetime.timedelta(minutes=30))
2021-08-24 18:06:44.703444
# 時(shí)間替換晒他,不會真的改變實(shí)際時(shí)間
>>> c_time = datetime.datetime.now()
>>> print(c_time)
2021-08-24 17:38:20.041454
>>> print(c_time.replace(minute=3,hour=2))
2021-08-24 02:03:20.041454
>>> print(c_time)
2021-08-24 17:38:20.041454
2,random模塊
import random
# 0-1之間的小數(shù)
print(random.random())
# 大于等于1且小于等于4的整數(shù)
print(random.randint(1,4))
#大于等于1且小于4的整數(shù)(不包括4)
print(random.randrange(1,4))
# choice后面跟列表或者元祖逸贾,隨機(jī)列表或元祖的一個(gè)數(shù)字(不一定是數(shù)字)
print(random.choice([1,33,[3,4],'ab']))
print(random.choice((1,33,[3,4],'ab')))
# 隨機(jī)從列表里選出2個(gè)元素
print(random.sample([1,33,[3,4],'ab'],2))
# 大于1小于4的小數(shù)
print(random.uniform(1,4))
#打亂順序
l=[1,2,3,4,5]
random.shuffle(l)
print(l)
#[5, 4, 2, 1, 6]
# 示例:生成隨機(jī)驗(yàn)證碼
def make_code(n):
res=''
for i in range(n):
s1=str(random.randint(0,9))
s2=chr(random.randint(65,90))
res+=random.choice([s1,s2])
return res
print(make_code(7))
# YR1OWO9
3陨仅,os模塊
os模塊是與操作系統(tǒng)交互的一個(gè)接口
# 獲取當(dāng)前目錄,相當(dāng)于shell下的pwd
>>> os.getcwd()
'/Users/shg'
# 切換工作目錄铝侵,相當(dāng)于shell下的cd(r的作用是注視引號內(nèi)的特殊意思)
>>> os.chdir(r"http://Users/shiheng/Desktop")
>>> os.getcwd()
'/Users/shg/Desktop'
# 創(chuàng)建遞歸文件夾
>>> os.makedirs('a/b/c')
# 創(chuàng)建單級目錄
>>> os.mkdir('a')
# 修改文件夾名
>>> os.rename('a','aa')
# 遞歸刪除(路徑必須要寫完整)
>>> os.removedirs('aa/b/c')
# 單級刪除灼伤,刪除c目錄 (刪除單級空目錄,若目錄不為空則無法刪除咪鲜,報(bào)錯(cuò))
>>> os.rmdir('a/b/c')
import os
# 將path分割成目錄和文件名二元組返回
print(os.path.split(r'/Users/sg/PycharmProjects/py-study/正則表達(dá)式/正則.py'))
# ('/Users/sg/PycharmProjects/py-study/正則表達(dá)式', '正則.py')
# 返回path的目錄狐赡。其實(shí)就是os.path.split(path)的第一個(gè)元素
print(os.path.dirname(r'/Users/sg/PycharmProjects/py-study/正則表達(dá)式/正則.py'))
# /Users/sg/PycharmProjects/py-study/正則表達(dá)式
# 返回path最后的文件名
print(os.path.basename(r'/Users/sg/PycharmProjects/py-study/正則表達(dá)式/正則.py'))
# 正則.py
# os.path.exists(path),路徑存在返回True,不存在返回False
print(os.path.exists(r'/User/py-study/正則表達(dá)式/正則.py'))
# False
# os.path.isabs(path) 如果path是絕對路徑疟丙,返回True
print(os.path.isdir(r'/root/a.txt'))
# 拼接路徑
print(os.path.join('/root','etc','a.txt'))
# /root/etc/a.txt
# normpath
BASE_DIR=os.path.normpath(os.path.join(
os.path.abspath(__file__),
'..',
'..'
))
print(BASE_DIR)
# /Users/shiheng/PycharmProjects/py-study
# 等同于
BASE_DIR2=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR2)
# /Users/shiheng/PycharmProjects/py-study
補(bǔ)充
os.getcwd() 獲取當(dāng)前工作目錄颖侄,即當(dāng)前python腳本工作的目錄路徑
os.chdir("dirname") 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cd
os.curdir 返回當(dāng)前目錄: ('.')
os.pardir 獲取當(dāng)前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空隆敢,則刪除发皿,并遞歸到上一級目錄,如若也為空拂蝎,則刪除穴墅,依此類推
os.mkdir('dirname') 生成單級目錄;相當(dāng)于shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄温自,若目錄不為空則無法刪除玄货,報(bào)錯(cuò);相當(dāng)于shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄悼泌,包括隱藏文件松捉,并以列表方式打印
os.remove() 刪除一個(gè)文件
os.rename("oldname","newname") 重命名文件/目錄
os.stat('path/filename') 獲取文件/目錄信息
os.sep 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當(dāng)前平臺使用的行終止符馆里,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用于分割文件路徑的字符串 win下為;,Linux下為:
os.name 輸出字符串指示當(dāng)前使用平臺隘世。win->'nt'; Linux->'posix'
os.system("bash command") 運(yùn)行shell命令可柿,直接顯示
os.environ 獲取系統(tǒng)環(huán)境變量
os.path.abspath(path) 返回path規(guī)范化的絕對路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實(shí)就是os.path.split(path)的第一個(gè)元素
os.path.basename(path) 返回path最后的文件名丙者。如何path以/或\結(jié)尾复斥,那么就會返回空值。即os.path.split(path)的第二個(gè)元素
os.path.exists(path) 如果path存在械媒,返回True目锭;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑纷捞,返回True
os.path.isfile(path) 如果path是一個(gè)存在的文件痢虹,返回True。否則返回False
os.path.isdir(path) 如果path是一個(gè)存在的目錄主儡,則返回True奖唯。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個(gè)路徑組合后返回,第一個(gè)絕對路徑之前的參數(shù)將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最后存取時(shí)間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時(shí)間
os.path.getsize(path) 返回path的大小
4缀辩,sys模塊
示例
#1 sys.argv 命令行參數(shù)List臭埋,第一個(gè)元素是程序本身路徑
#2 sys.exit(n) 退出程序,正常退出時(shí)exit(0)
#3 sys.version 獲取Python解釋程序的版本信息
#4 sys.maxint 最大的Int值
#5 sys.path 返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值
#6 sys.platform 返回操作系統(tǒng)平臺名稱
#!/usr/bin/env python
import sys
import os
if len(sys.argv) != 2:
print('Usage: ./vpn_clear.py username')
sys.exit()
username = sys.argv[1]
def clear_ipsec_conf(username):
"""
clear /etc/strongswan/ipsec.conf
"""
os.chdir('/etc/strongswan/')
with open('ipsec.conf', mode='rt') as f1, \
open('.tmp.swp', mode='wt') as f2:
tag = 0
for line in f1:
res = line.strip('\n').endswith(username)
if res:
tag = 1
if tag == 1 and line.strip() == '':
tag = 0
if tag == 0:
f2.write(line)
os.remove('ipsec.conf')
os.rename('.tmp.swp', 'ipsec.conf')
打印進(jìn)度條
import time
def progress(percent,width=50):
if percent >=1:
percent=1
show_str=('[%%-%ds]' % width) % ('#' * int(width*percent))
print('\r%s %d%%' %(show_str,int(100*percent)),end='')
recv_size=0
total_size=102312
while recv_size < total_size:
time.sleep(0.1)
recv_size+=1024
progress(recv_size/total_size)
5液斜,shutil模塊
# 如圖3
#1,shutil.copyfileobj將文件內(nèi)容拷貝到另一個(gè)文件中
import shutil
shutil.copyfileobj(open('正則.py','r'),open('new.xml','w'))
執(zhí)行后會新建個(gè)文件new.xml
# 2,shutil.copyfile拷貝我文件始鱼,目標(biāo)文件不需要存在
import shutil
shutil.copyfile('new.xml','bb.xml')
#3,shutil.copymode(src, dst)
僅拷貝權(quán)限会烙。內(nèi)容、組、用戶均不變
shutil.copymode('f1.log', 'f2.log') #目標(biāo)文件必須存在
#4,shutil.copy(src, dst) 拷貝文件和權(quán)限
import shutil
shutil.copy('f1.log', 'f2.log')
#5,shutil.copytree遞歸拷貝(目標(biāo)目錄一定不能存在
# 遞歸拷貝)
import shutil
shutil.copytree('/Users/sg/PycharmProjects/py-study/日志模塊','new_日志模塊',ignore=shutil.ignore_patterns('s*'))
#以上把Users/sg/PycharmProjects/py-study/日志模塊文件夾的所有內(nèi)容拷貝到“new_日志模塊”文件夾讥巡,并且忽略s開頭的文件
#6抬驴,import shutil 遞歸刪除
# 遞歸刪除(刪除文件夾及其所有的內(nèi)容)
import shutil
shutil.rmtree('new_日志模塊')
#7,shutil.move (類似于move)
# 類似mv命令
import shutil
shutil.move('new_日志模塊','hello')
#8按傅,shutil.make_archive壓縮文件
# 把/Users/sg/PycharmProjects/py-study/路徑下的"日志模塊"打包在當(dāng)前路徑命名為bak
(注意不需要自己家tar.gz后綴)
import shutil
ret=shutil.make_archive('bak','gztar',root_dir='/Users/sg/PycharmProjects/py-study/日志模塊')
當(dāng)前路徑會出現(xiàn)這個(gè)壓縮包 bak.tar.gz
#9, 解壓
import tarfile
t=tarfile.open('bak.tar.gz','r')
t.extractall('mmmm')
t.close()
把bak.tar.gz解壓為mmmm文件
#10芙委,zip壓縮
import zipfile
z=zipfile.ZipFile('zzbak.zip','w')
z.write('正則.py')
z.close
會把當(dāng)前的正則.py文件壓縮為zzbak.zip
#11逞敷,zip解壓
import zipfile
z=zipfile.ZipFile('zzbak.zip','r')
z.extractall(path='ppp')
解壓文件zzbak.zip,解壓到當(dāng)前目錄ppp下(ppp目錄不存在會自動創(chuàng)建)
#12灌侣,tar壓縮
import tarfile
# t=tarfile.open('ooooo','w')
# t.add('a.py',arcname='a.bak')
# t.add('b.py',arcname='b.bak')
# t.close()
a.py壓縮為a.bak
b.py壓縮為b.bak
放在ooooo這個(gè)壓縮包里
#13推捐,tar解壓
import tarfile
t=tarfile.open('ooooo','r')
t.extractall('ppp')
t.close()
打開壓縮包ooooo,解壓到當(dāng)前目錄ppp下
6侧啼,序列化json
# json不識別單引號
import json
dic={'name':'mz','age':22,'sex':'female'}
print(type(dic))
# <class 'dict'>
j=json.dumps(dic)
print(type(j))
# <class 'str'>
f=open('序列化對象','w')
f.write(j)
f.close()
# 會在當(dāng)前目錄下生成一個(gè)"序列化對象"內(nèi)容為 {"name": "mz", "age": 22, "sex": "female"}
# 把存到文件的內(nèi)容讀取到內(nèi)存(反序列化)
f=open('序列化對象','r')
data=json.loads(f.read())
7牛柒,pickle
# pick是byte類型
import pickle
dic={'name':'mmz','age':22,'sex':'female'}
print(type(dic))
# <class 'dict'>
j=pickle.dumps(dic)
print(type(j))
# <class 'bytes'>
f=open('序列化對象pickle','wb')
f.write(j)
f.close()
# 會生成一個(gè)"序列化對象的文件"堪簿,以bytes類型記錄dic
import pickle
f=open('序列化對象pickle','rb')
data=pickle.loads(f.read())
print(data)
# {'name': 'mmz', 'age': 22, 'sex': 'female'}
print(data['name'])
# mmz
print(data['age'])
# 22
#總結(jié):
JSON和Python內(nèi)置的數(shù)據(jù)類型對應(yīng)如下(不是所有的python類型都可以轉(zhuǎn)化為json)
pickle 以 bytes類型大多數(shù)都支持
8, shelve模塊
# a.txt文件本身不存在
import shelve
f=shelve.open('a.txt')
f['info1']={"name":"mz1","age":13,"sex":"female"}
f['info2']={"name":"mz2","age":23,"sex":"male"}
f['info3']={"name":"mz3","age":33,"sex":"female"}
#以上內(nèi)容保存到文件后皮壁,注釋掉椭更,執(zhí)行以下命令
print(f['info1']['name'])
# mz1
f.close()
#執(zhí)行close后,便在得不出結(jié)果
待更新