•很多常用和内置模块,我们只需要掌握他们的用法而暂时不用考虑内部是如何实现的,这些模块大大提升了开发效率 !
1、json模块与pickle模块
•json
如果你有这样的困扰,当希望把一种数据存到硬盘里,但发现只能保存为字符串,再取出来时不能直接被python解释器当作其他数据类型使用,
其实你想完成的事情就是序列化与反序列化的过程,那么json模块和pickle模块可以帮到你。
字典--》特定的字符串或二进制--(编码)--》存到硬盘--(读取解码)—》保存的字符串或二进制——》原数据类型
——-序列化—————————》—持久化--- |||——————|||—---------—》----------反序列化--------
如果你有其他语言的开发经验,那你一定听说或使用过json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。
将内存中的数据类型用json处理后变成json格式的字符串存在硬盘,以后取出来按json的方式解析,可以转回原数据类型进而使用。
优点:所有语言都能识别
缺点: 只支持python的 字典 列表 数字 None 字符串 bool
用法:
import json dict1 = {"name": '张'} js_dict1=json.dumps(dict1) with open('dict1.json','wt',encoding='utf8') as f: f.write(js_dict1) with open('dict1.json','rt',encoding='utf8') as f1: res=f1.read() dict1=json.loads(res) print(type(dict1)) # <class 'dict'> # 方法2 with open('dict1.json','wt',encoding='utf8') as f: json.dump(dict1,f) with open('dict1.json','rt',encoding='utf8') as f1: dict2=json.load(f1) print(dict2)
json的使用
json格式的文本没有单引号,只有双引号。
•pickle
pickle格式可以支持python的所有数据类型,但不能跨平台使用。
使用方法上,与json没有区别,只是写入文件时是用 b 模式。
import pickle with open('dict1.picke','wb',) as f: pickle.dump(dict1,f) with open('dict1.picke','rb',) as f2: dict2=pickle.load(f2) print(dict2) # ---------------------- dict1_p = pickle.dumps(dict1) with open('dict1.pkl', 'wb', ) as f: f.write(dict1_p) with open('dict1.pkl', 'rb', ) as f1: dict2 = pickle.loads(f1.read()) print(dict2)
pickle的使用
2、time模块和datetime模块
python用3种形式表示时间:
•时间戳 从1970.1.1至今的秒数
•结构化的时间对象 将时间的 年月日时分秒 星期等属性分开,作为对象供用户使用
•格式化的时间字符 提供时间和自定义格式
•time
import time print(time.time()) # 时间戳:1487130156.419527 print(time.strftime("%Y-%m-%d %X")) print(time.localtime()) #本地时区的struct_time print(time.gmtime()) #UTC时区的struct_time
time的使用
%a Locale’s abbreviated weekday name. %A Locale’s full weekday name. %b Locale’s abbreviated month name. %B Locale’s full month name. %c Locale’s appropriate date and time representation. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %I Hour (12-hour clock) as a decimal number [01,12]. %j Day of the year as a decimal number [001,366]. %m Month as a decimal number [01,12]. %M Minute as a decimal number [00,59]. %p Locale’s equivalent of either AM or PM. (1) %S Second as a decimal number [00,61]. (2) %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3) %w Weekday as a decimal number [0(Sunday),6]. %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3) %x Locale’s appropriate date representation. %X Locale’s appropriate time representation. %y Year without century as a decimal number [00,99]. %Y Year with century as a decimal number. %z Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59]. %Z Time zone name (no characters if no time zone exists). %% A literal '%' character. 格式化字符串的时间格式
格式化时间字符
三种格式的时间存在如下转换关系,使用对应的方法就可以转换:
#--------------------------按图1转换时间 # localtime([secs]) # 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。 time.localtime() time.localtime(1473525444.037215) #gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。 # mktime(t) : 将一个struct_time转化为时间戳。 print(time.mktime(time.localtime()))#1473525749.0 # strftime(format[, t]) : 把一个代表时间的元组或者struct_time(如由time.localtime()和 # time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个 # 元素越界,ValueError的错误将会被抛出。 print(time.strftime("%Y-%m-%d %X", time.localtime()))#2016-09-11 00:49:56 # time.strptime(string[, format]) # 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。 print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')) #time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, # tm_wday=3, tm_yday=125, tm_isdst=-1) #在这个函数中,format默认为:"%a %b %d %H:%M:%S %Y"。
转换方法
补充:sleep(secs) # 线程推迟指定的时间运行,单位为秒。
•datetime
相对于time模块,datetime在获取时间,做时间运算和时间转换上更为方便
import datetime # print(datetime.datetime.now()) #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分 # # c_time = datetime.datetime.now() # print(c_time.replace(minute=3,hour=2)) #时间替换 datetime模块
datetime的用法
3、random模块
random函数用来生产随机量
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之间的整数 ',[4,5]]))#1或者23或者[4,5] ',[4,5]],2))#列表元素任意2个组合 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 item=[1,3,5,7,9] random.shuffle(item) #打乱顺序 print(item)
random的使用
练习:用random写一个可以生成指定位数验证码的功能,验证码由大写字母和数字组成。
def code(num=4): str1 = "" for i in range(num): digit0 = str(random.randint(0, 9)) # 生成数字 alpha0 = chr(random.randint(65, 90)) # 生成字母 str0 = random.choice([digit0, alpha0]) str1 += str0 return str1 print(code(5))
生成验证码
4、hashlib模块
hash ,中文:散列,这是一类算法,只要有sha_1、sha_224、sha_256、md5等等
这种算法接收传入的内容,经过运算得到一串hash值,具有以下特点:
•只要传入的值一样,得到的hash值也一样
•几乎不能被反解
•只要使用hash的算法不变,hash值的长度就是固定的,而与传入的值的大小无关
由于这三个特性,hash普遍被应用于 密码传输(将明文密码hash后传输到服务器端保存)、文件校验(校验下载的文件和服务器端是否一致,只需要校验hash值)等用途。
hash的使用方法如下:
import hashlib h = hashlib.md5() h.update('''This module implements a common interface to many different secure hash and message digest algorithms.'''.encode('utf8')) h.update("加密key".encode('utf8')) print(h.hexdigest()) # c81547df387cea65942c22adb7077c8f
hash算法虽然几乎不可能被破解,但是对于密码这种不是很长的数据,可以采用穷举法暴力“撞库”,来得到原来的密码:
import hashlib passwds=[ 'alex3714', 'alex1313', 'alex94139413', 'alex123456', '123456alex', 'a123lex', ] def make_passwd_dic(passwds): dic={} for passwd in passwds: m=hashlib.md5() m.update(passwd.encode('utf-8')) dic[passwd]=m.hexdigest() return dic def break_code(cryptograph,passwd_dic): for k,v in passwd_dic.items(): if v == cryptograph: print('密码是===>\033[46m%s\033[0m' %k) cryptograph='aee949757a2e698417463d47acac93df' break_code(cryptograph,make_passwd_dic(passwds))
模拟撞库
python还有一个hmac模块,也是对数据进行加密的,可以自行了解。
5、sys模块
sys :system,见名知义,它提供了一系列关于系统的功能,这里的系统,对于python开发者来说,就是python解释器。
主要功能有:
# sys.argv # 返回一个列表,第一个元素是脚本路径,拥有列表的增删改查等操作,# #能实现在命令行从程序外部向程序内部传递参数# sys.exit(n) # 退出程序,正常退出时 n=0一般情况下执行到主程序末尾,解释器自动退出,# #但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序# # 表示你可以在主程序中捕获对sys.exit的调用。# sys.version # 获取python解释器的版本信息# sys.path # 环境变量列表,再导入自定义模块时,常用它将模块所在文件夹添加到环境变量# sys.platform # 获取当前系统平台. 如:win32、Linux等。
可以自己写一个在cmd命令行传入文件路径,实现文件复制的功能:
src_path = sys.argv[1] targe_path = sys.argv[2] with open(src_path, "rb")as f0, open(targe_path, "wb")as f1: while True: data = f0.read(1024) if not data: break f1.write(data)
复制文件