1,time 和 datetime 模块
import time
# 时间戳(1970年1月1日,秒计算)
>>> 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
# 当前时间+3天
>>> print(datetime.datetime.now() + datetime.timedelta(3))
2021-08-27 17:34:20.375315
# 当前时间-3天
>>> print(datetime.datetime.now() + datetime.timedelta(-3))
2021-08-21 17:35:27.432718
# 当前时间往后+3小时(往后倒3小时则负数-3表示)
>>> print(datetime.datetime.now() + datetime.timedelta(hours=3))
2021-08-24 20:36:12.993908
# 当前时间往后+30分钟(往后倒30分钟则负数-30表示)
>>> print(datetime.datetime.now() + datetime.timedelta(minutes=30))
2021-08-24 18:06:44.703444
# 时间替换,不会真的改变实际时间
>>> 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之间的小数
print(random.random())
# 大于等于1且小于等于4的整数
print(random.randint(1,4))
#大于等于1且小于4的整数(不包括4)
print(random.randrange(1,4))
# choice后面跟列表或者元祖,随机列表或元祖的一个数字(不一定是数字)
print(random.choice([1,33,[3,4],'ab']))
print(random.choice((1,33,[3,4],'ab')))
# 随机从列表里选出2个元素
print(random.sample([1,33,[3,4],'ab'],2))
# 大于1小于4的小数
print(random.uniform(1,4))
#打乱顺序
l=[1,2,3,4,5]
random.shuffle(l)
print(l)
#[5, 4, 2, 1, 6]
# 示例:生成随机验证码
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模块是与操作系统交互的一个接口
# 获取当前目录,相当于shell下的pwd
>>> os.getcwd()
'/Users/shg'
# 切换工作目录,相当于shell下的cd(r的作用是注视引号内的特殊意思)
>>> os.chdir(r"//Users/shiheng/Desktop")
>>> os.getcwd()
'/Users/shg/Desktop'
# 创建递归文件夹
>>> os.makedirs('a/b/c')
# 创建单级目录
>>> os.mkdir('a')
# 修改文件夹名
>>> os.rename('a','aa')
# 递归删除(路径必须要写完整)
>>> os.removedirs('aa/b/c')
# 单级删除,删除c目录 (删除单级空目录,若目录不为空则无法删除,报错)
>>> os.rmdir('a/b/c')
import os
# 将path分割成目录和文件名二元组返回
print(os.path.split(r'/Users/sg/PycharmProjects/py-study/正则表达式/正则.py'))
# ('/Users/sg/PycharmProjects/py-study/正则表达式', '正则.py')
# 返回path的目录。其实就是os.path.split(path)的第一个元素
print(os.path.dirname(r'/Users/sg/PycharmProjects/py-study/正则表达式/正则.py'))
# /Users/sg/PycharmProjects/py-study/正则表达式
# 返回path最后的文件名
print(os.path.basename(r'/Users/sg/PycharmProjects/py-study/正则表达式/正则.py'))
# 正则.py
# os.path.exists(path),路径存在返回True,不存在返回False
print(os.path.exists(r'/User/py-study/正则表达式/正则.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
补充
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
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
4,sys模块
示例
#1 sys.argv 命令行参数List,第一个元素是程序本身路径
#2 sys.exit(n) 退出程序,正常退出时exit(0)
#3 sys.version 获取Python解释程序的版本信息
#4 sys.maxint 最大的Int值
#5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
#6 sys.platform 返回操作系统平台名称
#!/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')
打印进度条
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将文件内容拷贝到另一个文件中
import shutil
shutil.copyfileobj(open('正则.py','r'),open('new.xml','w'))
执行后会新建个文件new.xml
# 2,shutil.copyfile拷贝我文件,目标文件不需要存在
import shutil
shutil.copyfile('new.xml','bb.xml')
#3,shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
#4,shutil.copy(src, dst) 拷贝文件和权限
import shutil
shutil.copy('f1.log', 'f2.log')
#5,shutil.copytree递归拷贝(目标目录一定不能存在
# 递归拷贝)
import shutil
shutil.copytree('/Users/sg/PycharmProjects/py-study/日志模块','new_日志模块',ignore=shutil.ignore_patterns('s*'))
#以上把Users/sg/PycharmProjects/py-study/日志模块文件夹的所有内容拷贝到“new_日志模块”文件夹,并且忽略s开头的文件
#6,import shutil 递归删除
# 递归删除(删除文件夹及其所有的内容)
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/路径下的"日志模块"打包在当前路径命名为bak
(注意不需要自己家tar.gz后缀)
import shutil
ret=shutil.make_archive('bak','gztar',root_dir='/Users/sg/PycharmProjects/py-study/日志模块')
当前路径会出现这个压缩包 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
会把当前的正则.py文件压缩为zzbak.zip
#11,zip解压
import zipfile
z=zipfile.ZipFile('zzbak.zip','r')
z.extractall(path='ppp')
解压文件zzbak.zip,解压到当前目录ppp下(ppp目录不存在会自动创建)
#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这个压缩包里
#13,tar解压
import tarfile
t=tarfile.open('ooooo','r')
t.extractall('ppp')
t.close()
打开压缩包ooooo,解压到当前目录ppp下
图3
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()
# 会在当前目录下生成一个"序列化对象"内容为 {"name": "mz", "age": 22, "sex": "female"}
# 把存到文件的内容读取到内存(反序列化)
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()
# 会生成一个"序列化对象的文件",以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
#总结:
JSON和Python内置的数据类型对应如下(不是所有的python类型都可以转化为json)
pickle 以 bytes类型大多数都支持
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"}
#以上内容保存到文件后,注释掉,执行以下命令
print(f['info1']['name'])
# mz1
f.close()
#执行close后,便在得不出结果
待更新