包与常用模块:time,sys。
一 包的初识:
首先包在pycharm中的表现形式为packa文件夹:在python3种那么我们创建一个packa时会发现下边会自动跟一个—init—.py文件
包的定义:包就是一个包含有——init——.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来。
注意:
1)在python3种,即使包下面没有——init——.py文件,import包仍然不会报错,而且还可以自己创建该文件,在python2种一定要有这个个文件。
2)创建包的目的不是为了运行,而是供被导入使用,包只是一种形式而已,它的本质还是一种模快。
2 包的使用:
在使用包之前我们先说下为什么要用包,包的本质就是一个文件夹,准确来说是一个自带有——init——.py文件的文件夹,那么随着我们功能越来越多,我们不可能将所有的功能都放到一个文件里面去,所以我们创建文件夹来将文件组织起来,来提高程序的结构性,更便于维护。
导入注意事项:
1)对于包的导入也可以用import和from。。。import。。。但是包的导入时凡是导入时带点的点的左边必须是一个包,这是导入包特有的语法,而且import后面必须跟一个明确的名字不能带点(...)。
2)导入后使用的过程就没有这种规定了。
3)对于包内部模块的直接导入应该使用from。。。import。。。
4)import导入文件时,产生名称空间中的名字来源于import包,产生的名称空间的名字来源于文件,即包下的——init——.py文件,导入包的本质就是导入该文件。
from aaa import bbb#在同一个包下相互调用, print(bbb.func2) res=bbb.func2 res() print(bbb.x) import aaa from aaa import ccc#调用ccc实际上就是调用ccc下的——init-- res=aaa.ccc.f res1=aaa.ccc.ccc res() print(res) print(res1) print(ccc)#我们可以看出输出的结果为ccc下的__init__.py文件的路径,也就是说我们调用ccc其实就是在调用ccc下的init from aaa import bbb bbb.func2() print(bbb.x)
文件bbb def func2(): print('from aaa.bbb.func2') x=1 文件init # import bbb def func(): print('aaa.init')
二:模块
1 time与datetime模块
2 python中三种时间表示:
1)时间戳(timestamp):通常来说,时间戳表示的是1970年1月1日00:00:00开始计算的时间偏移量。我们运行type(time.time())返回的是float类型。 2)格式化的时间字符串(format string)
3)结构化的时间(struct—time):元素共含有九个元素:(年,月 ,日 ,时, 分, 秒,一年中的第几周,一年中的第几天,夏令时)
3 格式化字符串时间格式:
4 三种格式之间的转换:
那么我们为什么要那么复杂的将时间分格式呢,因为计算机只能识别时间戳,而程序员只能识别结构化的时间或格式化的字符串时间。
那么根据上图一些转换关系:
1 #--------------------------按图1转换时间 2 # localtime([secs]) 3 # 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。 4 time.localtime() 5 time.localtime(1473525444.037215) 6 7 # gmtime([secs]) 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。 8 9 # mktime(t) : 将一个struct_time转化为时间戳。 10 print(time.mktime(time.localtime()))#1473525749.0 11 12 13 # strftime(format[, t]) : 把一个代表时间的元组或者struct_time(如由time.localtime()和 14 # time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个 15 # 元素越界,ValueError的错误将会被抛出。 16 print(time.strftime("%Y-%m-%d %X", time.localtime()))#2016-09-11 00:49:56 17 18 # time.strptime(string[, format]) 19 # 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。 20 print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')) 21 #time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, 22 # tm_wday=3, tm_yday=125, tm_isdst=-1) 23 #在这个函数中,format默认为:"%a %b %d %H:%M:%S %Y"。 复制代码
5 datetime模块主要的应用:
#时间加减 import 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分 # # c_time = datetime.datetime.now() # print(c_time.replace(minute=3,hour=2)) #时间替换 复制代码
其实我们一般应用datetime模块更多,因为他更方便实用。
我们可以直接导入datetime模块输出我们想要的时间格式:2018-04-08 15:17:27.377304
import datetime
print(datetime.datetime.now())
6 random模块
random一些常用功能:
1 import random 2 3 print(random.random())#(0,1)----float 大于0且小于1之间的小数 4 5 print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数 6 7 print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数 8 9 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] 10 11 print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合 12 13 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 14 15 16 item=[1,3,5,7,9] 17 random.shuffle(item) #打乱item的顺序,相当于"洗牌" 18 print(item)
随机生成验证码:实际应用小模块。
import random def make_code(n): res='' for i in range(n): s1=chr(random.randint(65,90)) s2=str(random.randint(0,9)) res+=random.choice([s1,s2]) return res print(make_code(9))
7 sys模块
sys模块常用功能:
1 sys.argv 命令行参数List,第一个元素是程序本身路径
2 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
使用sys与time模块实现打印进度条:
8 shutil模块
主要对文件和文件夹进行copy,压缩等操作。
1)文件copy:
shutil.copyfileobj(fsrc(源文件),fdst[,length])
将文件内容拷贝到另一个文件中
1 import shutil
2 shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
拷贝文件
1 shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
1 shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
shutil.copystat(src, dst)
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
1 shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
关于使用shutil来进行文件的压缩与解压:
shutil.make_archive(base_name, format,...) 创建压缩包并返回文件路径,例如:zip、tar 创建压缩包并返回文件路径,例如:zip、tar base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, 如 data_bak =>保存至当前路径 如:/tmp/data_bak =>保存至/tmp/ format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar” root_dir: 要压缩的文件夹路径(默认当前目录) owner: 用户,默认当前用户 group: 组,默认当前组 logger: 用于记录日志,通常是logging.Logger对象 1 #将 /data 下的文件打包放置当前程序目录 2 import shutil 3 ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data') 4 5 6 #将 /data下的文件打包放置 /tmp/目录 7 import shutil 8 ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data') shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细: import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall(path='.') z.close() import tarfile # 压缩 >>> t=tarfile.open('/tmp/egon.tar','w') >>> t.add('/test1/a.py',arcname='a.bak') >>> t.add('/test1/b.py',arcname='b.bak') >>> t.close() # 解压 >>> t=tarfile.open('/tmp/egon.tar','r') >>> t.extractall('/egon') >>> t.close() 复制代码