模块
模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块。//一个库包括一个至多个模块,至少一个
模块分为三种:
自定义模块
内置模块
开源模块
内置模块
一、time & datetime模块
时间相关的操作,时间有三种表示方式:
时间戳 :1970年1月1日之后的秒,即:time.time()
格式化的字符串 :2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
结构化时间 :元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
importtime#1、time.sleep() :停止n秒
print("等5秒")
time.sleep(5)print("5秒结束")#2、time.time() :返回当前系统的时间戳,1970年1月1日之后d到现在的秒数
ret =time.time()print(ret)#输出:1500989660.9683125
#3、time.ctime() :返回当前日期的字符串格式
print(time.ctime())#输出:Tue Jul 25 21:37:43 2017
#4、time.ctime(time.time()-86400) :返回前一天当前的时间
print(time.ctime(time.time()-86400))#输出:Mon Jul 24 21:40:50 2017
#5、time.gmtime(time.time()-86400) :返回前一天当前utc时间的struc时间对象格式//无参数时,当前的struct_time的时间
print(time.gmtime(time.time()-86400))#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=14, tm_min=10, tm_sec=57, tm_wday=0, tm_yday=205, tm_isdst=0)
time_obj = time.gmtime(time.time()-86400)print(time_obj)#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=14, tm_min=10, tm_sec=57, tm_wday=0, tm_yday=205, tm_isdst=0)
#time结构对象,可以随意取里面的值进行拼接,注意,这里面的值全是int型
print(time_obj.tm_year)#输出:2017
print(str(time_obj.tm_year) + "-" + str(time_obj.tm_mon) + "-" +str(time_obj.tm_mday))#输出:2017-7-25
print("%s-%s-%s"%(time_obj.tm_year,time_obj.tm_mon,time_obj.tm_mday))#输出:2017-7-25
print("%s-%s-%s %s:%s"%(time_obj.tm_year,time_obj.tm_mon,time_obj.tm_mday,time_obj.tm_hour,time_obj.tm_min))#输出:2017-7-24 14:10 UTC时间,东八区,差八个小时
#6、time.localtime() :返回本地时间 的struct time对象格式
print(time.localtime())#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=25, tm_hour=22, tm_min=7, tm_sec=49, tm_wday=1, tm_yday=206, tm_isdst=0)
print(time.localtime(time.time()-86400))#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=22, tm_min=7, tm_sec=49, tm_wday=1, tm_yday=206, tm_isdst=0)
#7、time.mktime(time.localtime()) :将struct_time格式转回时间戳格式
time_obj =time.localtime()print(time.mktime(time_obj))#输出:1500992261.0
#8、time.strftime() :将struct_time格式转成指定的字符串格式
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))#输出:2017-07-25 22:24:30
#9、time.strptime() :将字符串格式转换成struct_time格式
print(time.strptime("2017-07-25","%Y-%m-%d"))#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=206, tm_isdst=-1)
#前后要对应,对应的连接符号也要相同
time_obj = time.strptime("2017-07-25 22:24:30","%Y-%m-%d %H:%M:%S")print(time_obj)#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=25, tm_hour=22, tm_min=24, tm_sec=30, tm_wday=1, tm_yday=206, tm_isdst=-1)
#10、time.asctime() ::返回当前日期的字符串格式,与 time.ctime()输出相同
print(time.asctime())print(time.asctime(time.localtime()))#两个输出相同:Tue Jul 25 22:36:32 2017
time
importtimeimportdatetime#1、datetime.date.today() :输出当前字符串日期
print(datetime.date.today())#输出:2017-07-25
#2、datetime.date.fromtimestamp(time.time()) :时间戳直接转成日期格式
print(datetime.date.fromtimestamp(time.time()))#输出:2017-07-25
print(datetime.date.fromtimestamp(time.time()-86400))#输出:2017-07-24
#3、datetime.datetime.now() :当前时间
print(datetime.datetime.now())#输出:2017-07-25 22:44:53.979426
current_time=datetime.datetime.now()#4、datetime.datetime.now().timetuple() :输出时间对象,返回struct_time格式
print(current_time.timetuple())#输出:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=25, tm_hour=22, tm_min=48, tm_sec=33, tm_wday=1, tm_yday=206, tm_isdst=-1)
#5、datetime.datetime.now().replace(年,月,日) :返回当前时间,但指定的值会被替换
print(current_time)#输出:2017-07-25 22:54:02.178782
print(current_time.replace(1990,6,25))#输出:1990-06-25 22:54:02.178782
#参数可以是:(年)、(年,月)、(年、月、日)
#5.1、datetime.datetime.now().replace() :通过参数修改时间,可以只修改几个,也可以全部修改
print(current_time)print(current_time.replace(year=2000, month=10, day=12, minute=3, hour=2, second=30))'''2017-07-25 23:22:07.510177
2000-10-12 02:03:30.510177'''
#6、datetime.datetime.strptime() :将字符串转成日期格式
str_to_date = datetime.datetime.strptime("21/11/06 16:30","%d/%m/%y %H:%M")print(str_to_date)#输出:2006-11-21 16:30:00 %y:两位制的年
#7、时间加减
print(datetime.datetime.now() + datetime.timedelta(days=3)) #当前时间+3天
#print(datetime.datetime.now() + datetime.timedelta(3))
print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(weeks=3)) #当前时间+3周
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
print(datetime.datetime.now() + datetime.timedelta(seconds=30)) #当前时间+30秒
print(datetime.datetime.now()) #当前时间
'''2017-07-28 23:13:03.168042
2017-07-22 23:13:03.194044
2017-08-15 23:13:03.202044
2017-07-26 02:13:03.208045
2017-07-25 23:43:03.214045
2017-07-25 23:13:33.219045
2017-07-25 23:13:03.226046
#当前时间:2017-07-25 23:13:03.226046
#注意:天的变换直接加数字也可以'''
datetime
二、sys模块
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:')
val= sys.stdin.readline()[:-1]
importsys#1、sys.argv :命令行参数List,第一个元素是程序本身路径
print(sys.argv)if sys.argv[1] == "abc":print("哈哈")else:print("嘿嘿")#python a..py abc
#2、sys.path :返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
print(sys.path)#输出:['C:\\Users\\Administrator\\Desktop',
#'F:\\python3.6\\python36.zip',
#'F:\\python3.6\\DLLs',
#'F:\\python3.6\\lib',
#'F:\\python3.6',
#'F:\\python3.6\\lib\\site-packages']
#输出的是个路径列表:当前所在程序路径、上一级、以及Python相关的东东、还有个site-packages
#site-packages:存放所有第三方安装的模块,全局都可以用(任何地方)
#3、sys.exit(n) :退出程序,正常退出时exit(0)
choice = input("wanna quit?")if choice == 'y' or choice == 'Y':
exit("good bye !!!")#sys.exit("good bye !!!")
#与exit()效果相同
#4、sys.version :获取Python解释程序的版本信息
print(sys.version)#输出:3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]
#5、sys.platform :返回操作系统平台名称
#可用于收集硬件信息
print(sys.platform)#输出:win32
#6、sys.stdout.write() :输出到屏幕(可用于输出动态进度条)
importtimefor i in range(100):
sys.stdout.write('#')
time.sleep(0.3)#7、sys.stdin.readline() :读取屏幕的输入(input也是调用这个)
sys
练习:1、读写用户的输入,根据用户的输入,创建一个相应的目录
importosimportsys
os.mkdir(sys.argv[1])#Python test.py newdir#test为文件名,newdir是新建的文件夹名
2、自己写一个脚本,可以在任何路径导入
#写一个脚本,将其放在Python安装目录下的\lib\site-packages目录下即可
3、进度条,带百分比
importsysimporttimefor i in range(11):
sys.stdout.write('\r\r')
sys.stdout.write("%s%% |%s\n"%(int(i/10*100),int(i/10*100)*'*'))
sys.stdout.flush()
time.sleep(0.1)
三、json 和 pickle模块
用于序列化的两个模块
json :用于字符串 和 python数据类型间进行转换
pickle :用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
************************************************************************************************************************
pickle
************************************************************************************************************************
pickle支持的可序列化的有:任何数据类型,包括面向对象的对象
案例背景:未涉及到数据库,此外,例如京东登录,金钱信息、购买记录信息等存在文本中。
此文件中:一行:用户名,密码,目的地,手机号,余额,邮箱
购买后,将余额修改掉,就要找到修改的那一行,但是实际上你要修改的的字节数要和之前的一样,前后不一样的数据字节会出错,差异的字符或字节会影响到数据
所以必须要把所有的数据重新写进去。
解决:用字典的形式存取修改,k为账号ID,值为email、用户名、密码、余额、电话等等
注意:文件里面只能存储字符串格式或二进制数据,不能存任何的其他的数据类型,如数字,浮点,字典,列表,元组等都不能存
###########################################################################file1.py:向文本写入用户数据信息##########################################################################
importpickle
accounts={1000:{ #1000位账户ID
'name':'zxg','email':'xgzhang0626@gmail.com','passwd':'abc123','balance':15000, #余额
'phone':17750021629,'bank_acc':{'ICBC':142354,'CBC':454554,'ABC':3546845}#多个银行账户
},1001:{'name':'bbj','email':'xgzhang.hqu@gmail.com','passwd':'66666','balance':15000, #余额
'phone':15555915904,'bank_acc':{'ICBC':1424644},
}
}print(pickle.dumps(accounts))#此时pickle模块将字典转换成字符串,但输出显示的二进制#输出:b'\x80\x03}q\x00(M\xe8\x03}q\x01(X\x04\x00\x00\x00nameq...........
f= open(r'C:\Users\Administrator\Desktop\test.txt','wb')
p_str=pickle.dumps(accounts)
f.write(p_str)#将pickle转换后的字符串写入文本
f.close()###########################################################################file2.py:消费之后,修改余额,并重新写入原文件,也可以写入到新的文件##########################################################################
importpickle#在另一个文件对文本中的数据进行操作
account_file= open(r'C:\Users\Administrator\Desktop\test.txt','rb')
account_dic=pickle.loads(account_file.read())#将文本中的数据转回成字典
#print(account_dic) 输出的是之前的存进去的字典
account_file.close()#修改数据
account_dic[1000]['balance'] -= 500
#输出查看一下,已经修改#print(account_dic)
f= open(r'C:\Users\Administrator\Desktop\test.txt','wb')
p_str=pickle.dumps(account_dic)#更改之后,转换成字符串格式
f.write(p_str)#写入数据
f.close()###########################################################################file3.py:查看一下数据信息##########################################################################
importpickle
f= open(r'C:\Users\Administrator\Desktop\test.txt','rb')
account_read=pickle.loads(f.read())
f.close()print(account_read)#此时输出查看:数据已经更新
京东小案例
#dumps :将字典转换成字符串格式
importpickle
accounts={1000:{ #1000位账户ID
'name':'zxg','email':'xgzhang0626@gmail.com','passwd':'abc123','balance':15000, #余额
'phone':17750021629,'bank_acc&