python常用模块之一
time模块****
在Python中,通常有这几种方式来表示时间:
时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
格式化的时间字符串 2018-05-20 19:45:04
元组(struct_time) : struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
#!/usr/bin/env python#-*- coding: utf-8 -*-#@Time : 18-5-19 下午3:26#@Author : LK#@File : time_modular.py#@Software: PyCharm
importtime#时间戳 计算
print(time.time()) #从1970 年到现在有多少秒
#结构化时间#time.struct_time(tm_year=2018, tm_mon=5, tm_mday=19,#tm_hour=15, tm_min=32, tm_sec=0, tm_wday=5, tm_yday=139, tm_isdst=0)
print(time.localtime())
t=time.localtime()print(t.tm_year) #2018
#结构化时间 转换成时间戳 看图
print(time.mktime(time.localtime(123213)))#将结构化时间转换当成字符串时间 2018-05-19 15:40:38
print(time.strftime('%Y-%m-%d %X',time.localtime()))#将字符串时间装换成结构化时间#time.struct_time(tm_year=2018, tm_mon=5, tm_mday=19,#tm_hour=15, tm_min=40, tm_sec=38, tm_wday=5, tm_yday=139, tm_isdst=-1)
print(time.strptime('2018:05:19:15:40:38', "%Y:%m:%d:%X"))#Sat May 19 15:46:22 2018
print(time.asctime())print(time.ctime())importdatetime#2018-05-19 15:48:08.429398
print(datetime.datetime.now())
时间类型的相互转换
datetime模块****
可以用来做时间的计算
print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
print(datetime.date.fromtimestamp(time.time()) ) #时间戳直接转成日期格式 2016-08-19
print(datetime.datetime.now() )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分
random模块***
#!/usr/bin/env python#-*- coding: utf-8 -*-#@Time : 18-5-19 下午3:51#@Author : LK#@File : 随机模块.py#@Software: PyCharm
importrandomprint(random.randint(0, 9)) #0到9随机产生一个数
print(random.random()) #0-1 float
print(random.randrange(1, 3)) #[1, 3)
print(chr(random.randint(65, 122))) #产生一个随机字母
print(random.choice([1, '23', [4, 5]])) #在这个列表里面随机选
print(random.sample([1, '23', [4, 5]], 2)) #选择两个随机组合
## 将a转换成ascii ord('a')#print(ord('a')) 翻过来chr(数字)
random
#产生一个4位数字和字母的含有字母的验证码
res = ''
for i in range(1,5):
t= random.randint(0, 9)
s= chr(random.randint(65,90))
s2= chr(random.randint(97, 122))
res+=str(random.choice([t,s, s2]))print(res)
验证码
os模块****
os是一个提供和系统交互的模块
#字符串拼接尽量不用+ 用join, 因为+所占内存是+前和后的
importos
os.getcwd()#获取当前工作目录,即当前python脚本工作的目录路径
print(os.getcwd())
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.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间
os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间
os方法
importos
path= os.path.abspath(__file__)
path2= os.path.dirname(__file__)
path3= os.path.dirname(os.path.abspath(__file__))
path4=os.path.split(path3)[0]
path5= os.path.join(path4, "test/ogf", "inog")print(path)print(path2)print(path3)print(path4)print(path5)
结果:/home/lk/Desktop/py_project/chapt16/bin/python /home/lk/Desktop/pro_py/模块/model/os_modular.py/home/lk/Desktop/pro_py/模块/model/os_modular.py/home/lk/Desktop/pro_py/模块/model/home/lk/Desktop/pro_py/模块/model/home/lk/Desktop/pro_py/模块/home/lk/Desktop/pro_py/模块/test/ogf/inog
简单应用
#在win下会把c:/windows\\system32\\ -->c:\\windows\\system32\\
os.path.normcase('c:/windows\\system32\\')#'c:\\windows\\system32\\'
#规范化路径,如..和 /
os.path.normpath('c://windows\\System32\\../Temp/')#'c:\\windows\\Temp'
#在linux下会---->/ Users / jieli / test1
a = '/Users/jieli/test1/\\\a1/\\\\aa.py/../..'
print(os.path.normpath(a))#/ Users / jieli / test1
路径规范化
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
路径处理
sys模块****
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
关于argv函数
直接看效果图
常用在 登录,就像mysql的登录 mysql -u root -p ..... 会把参数自动传给argv然后 在对argv操作,就不用让用户一步一步的输入了
#进度条,
importtimefor i in range(80):
sys.stdout.write('#') #print的底层实现就是利用的这个
time.sleep(0.1)
sys.stdout.flush()#
#sys.stdout.write('#') 向屏幕输出内容, 但是要等到缓存完成后,一次性打印#sys.stdout.flush() 刷新缓存, 就是如果有内容就输出
low版进度条
#=========知识储备==========#进度条的效果
[#]
[## ]
[### ]
[#### ]
#指定宽度
print('[%-15s]' %'#')print('[%-15s]' %'##')print('[%-15s]' %'###')print('[%-15s]' %'####')#打印%
print('%s%%' %(100)) #第二个%号代表取消第一个%的特殊意义
#可传参来控制宽度
print('[%%-%ds]' %50) #[%-50s]
print(('[%%-%ds]' %50) %'#')print(('[%%-%ds]' %50) %'##')print(('[%%-%ds]' %50) %'###')#=========实现打印进度条函数==========
importsysimporttimedef progress(percent,width=50):if percent >= 1:
percent=1show_str=('[%%-%ds]' %width) %(int(width*percent)*'#')print('\r%s %d%%' %(show_str,int(100*percent)),file=sys.stdout,flush=True,end='')#=========应用==========
data_size=1025recv_size=0while recv_size
time.sleep(0.1) #模拟数据的传输延迟
recv_size+=1024 #每次收1024
percent=recv_size/data_size #接收的比例
progress(percent,width=70) #进度条的宽度70
进度条
json和pickle模块****
json和pickle类似,就连用法都很像,就是将数据类型转换成字符串存放起来,存到文件中
pickle的类型多一点,但是他存的格式是byte类型的,所以json比较常用
#dump/dumps是将数据转换成字符串,load/loads是将字符串转成数据类型
#pickle 和json类似,方法都一样, 就是pickle保存的数据是不是字符串而知字节, 所以读文件是用'rb', 写文件用'wb'## pickle 支持的类型更多, 但是json更好用
#json 在其他语言也能用
importjson
dic= {'name' : 'luck'} #用json处理, --> 单引号变成双引号, 然后在最外面在加上""
data =json.dumps(dic)#data是一个字符串类型, json的 就是说是{"name": "luck"},双引号, 这样的话其他语言也可以使用
print(data)print(type(data)) #str
#dic = {'name' : 'luck'} ---> {"name": "luck"} ---> str({"name": "luck"})#i = 8 ---> str(8)#s = 'hello' --->"hello" --->str("hello")#l = [11,22] --->"[11,22]"
json基本使用
#普通的向文件中读写数据时:#如果向文件中存放一个字典, 将下面的字典放到文件中去
dic = {'name' : 'luck'}
str_d=str(dic)#写文件
f_write = open('dic.txt', 'w')
f_write.write(str_d)
f_write.close()#读文件
f_read = open('dic.txt', 'r')
data= f_read.read() #z字符串 用eval转换成字典, 列表, 元祖, 但是不能转成类, 函数等
data =eval(data)print(data, type(data)) #{'name': 'luck'}
f_read.close()
json读取文件,写文件,
#普通的向文件中读写数据时:#如果向文件中存放一个字典, 将下面的字典放到文件中去
dic = {'name' : 'luck'}
str_d=str(dic)#写文件
f_write = open('dic.txt', 'w')
f_write.write(str_d)
f_write.close()#读文件
f_read = open('dic.txt', 'r')
data= f_read.read() #z字符串 用eval转换成字典, 列表, 元祖, 但是不能转成类, 函数等
data =eval(data)print(data, type(data)) #{'name': 'luck'}
f_read.close()#思路就是: 现将数据转换成字符串,然后在写入文件,读的时候就是把字符串读出来,然后转换成一定的格式#dumps就相当于将数据转换成字符串, loads相当于将字符串读出来并转换成一定的格式#利用json实现
importjson
dic= {'name': 'lucky'}
f_write= open('new.txt','w') #只需要将要写的数据传个dumps,返回一个字符串类型的数据
data = json.dumps(dic) #json.dump(dic, f_write)
f_write.write(data)
f_write.close()#读数据
f_read = open('new.txt', 'r')
data= json.loads(f_read.read()) #json.load(f_read)
print(data)
f_read.close()
json应用