包 与常用模块

什么是包:

包就是一个包含有__init__.py 文件的文件夹, 所以我们创建包的目的就是为了用文件夹将文件或者模块组织起来。

需要强调的是:

第一点:在python3中,即使包下没有__init__.py文件,import包仍然不会报错,而在python2中,包下一定要有该文件,,否则import包会报错。

第二点:创建包的目的不是问了运行, 而生被导入使用, 所以一定要 记住:包只是模块的一种形式而已, 包的本质就是一种模块。不可以当做执行文件。

这样就创建了一个包(文件夹aaa,里面自带 __init__.py) 所以aaa就是一个包。

关于包相关导入语句 也分为 import 和 from.... import...  两种

 既然说包的本质就是模块, 那么导入包的过程也产生3个步骤

第一:产生一个包的名称空间

第二:执行包下的__init__.py 文件,将产生的名字存放于包的名称空间中

第三:在当前执行文件中拿到一个名字,该名字指向包的名称空间。

下面我们来运行导入包文件:

在day16 目下创建一个包(aaa),  还有一个执行文件 ( 练习.py)

要运行aaa下的文件  首先要到在练习.py 里导入aaa :   import   aaa.导入aaa后,那么运行的 都为aaa包下__init__.py 文件的代码块。

若比如在aaa 下,除了有__init__.py外,还有其他文件或者包,如图:。若要在执行文件中运行aaa下的m1.py 或者bbb文件包的话,应该在

aaa 下的__init__.py里导入m1:   from aaa import m1   或者 from aaa import  bbb . 那么就可以执行aaa 下的m1 或者bbb下的__init__.py 的内容了(只是执行bbb下的__init__.py 文件)。若是bbb包里还有其他文件或者其他包 如图:。里面有__init__.py,还有m2.py,还有ccc包。若要在执行文件 练习.py里执

行m2 和ccc 下的 __init__.py 代码块,则应该在bbb下的__init__.py 里导入模块:from aaa.bbb import m2   或者from aaa.bbb import ccc。若是ccc 包里还有其他文件或包, 则继续在ccc下的__init__.py 里导入,  切记导入时的起始路径一定是从执行文件所在的当前目录做为起始路径:如:aaa.bbb.ccc.(执行文件练习.py  与aaa是在同一目录day16 下。  

重点强调:

1:在导入时带点的, 点的左边必须是一个包,这是导入包特有的语法。

2:包内,模块直接的导入应该使用 from .....import..

3: from...import....., import后必须是一个明确的名字,没有任何的前缀。

二:若是需要导入的包与执行文件不在同一个文件目录下(如上面的执行文件 练习.py 与aaa同在day16 目录下)。若是执行文件day16下, 而包aaa 不在day16 下呢 该如何导入;

这就需要运用到sys模块,  需要在执行文件中添加上包所在文件路径: 

现在执行文件上导入sys 模块,(sys.path 是一个列表,然后可以append上包的文件路径(这个包的文件路径只能到包所在那个文件夹的路径为止, 不能有包的路径在里面, 否则的话会报错。比如aaa 在day16 文件夹里,那么append的路径只能到day16, 不可以继续在加上aaa , 否则import不到aaa)):

例如: 我把执行文件 练习.py 继续放在day16里,  aaa包则放在了0407 文件夹里。我在执行文件里调用0407下面的aaa包文件 

在执行文件里添加:

import sys
sys.path.append(r'D:python316 est1407')
import aaa

这样就可以继续之前的操作 调用bbb ,ccc了。

三、绝对路径和相对路径

如 一个名为 nb 的包里,  里面有三个模块文件 m1,m2,m3.   m1 里分别有f1 , f2, 代码块, m2里有f3和f4 代码块,  m3里有f5 和 f6代码块。

有两种导入办法:一种是绝对导入,一种是相对导入

  绝对导入
from nb.m1 import f1,f2
from nb.m2 import f3,f4
from nb.m3 import f5,f6
from nb.p1.m4 import f7


相对导入
from .m1 import f1,f2
from .m2 import f3,f4
from .m3 import f5,f6
from .p1.m4 import f7

相对导入好处是防止把文件写死, 若是用绝对导入的话,  nb 这个包换名字的话  则下面的导入全部都得更改, 增加了工作量

而相对导入的话 用  . 来代替,或者  .. 来代替。一个点 代表当前文件目录, 2个点代表前一个文件目录。这样的话及时更改包的名称,   .点 也可以接受新的文件名。

四: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的整数
print(random.choice([1,'23',[4,5]]))    #    1或者23 或者[4,5] 列表中的任意一个元素
print(random.sample([1,'23',[4,5]],2))  #列表中任意2个组合
print(random.uniform(1,3))               #大于1小于3 的小数  如2.111123



打印结果
0.4445244883733305
3
2
1
[1, [4, 5]]
1.1993361628557961

五:time模块

时间分为三种形式

1:时间戳

import time

start_time =time.time()
time.sleep(2)
stop_time=time.time()
print(stop_time-start_time)
 
#打印结果
2.0007588863372803

2:格式化的字符串

print(time.strftime('%Y-%m-%d %H:%M:%S %p'))

#打印结果
2018-04-08 17:15:48 PM

还可以有另外一种形式:
print(time.strftime('%Y-%m-%d %X %p'))

#打印结果
2018-04-08 17:15:48 PM

3:struct_time对象

import time

print(time.localtime())
#打印结果
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=8, tm_hour=17, tm_min=20, tm_sec=57, tm_wday=6, tm_yday=98, tm_isdst=0)


print(time.localtime().tm_year) #只要求年
#打印结果:2018


print(time.gmtime())#UTC时区  比我们的时间晚8个小时
#打印结果
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=8, tm_hour=9, tm_min=23, tm_sec=29, tm_wday=6, tm_yday=98, tm_isdst=0)

4: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)) #时间替换

六 :shutil模块      高级的文件,文件夹 压缩包处理模块

shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中

1 import shutil
2  
3 shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

shutil.copyfile(src, dst)
拷贝文件

1 shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在

shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变

1 shutil.copymode('f1.log', 'f2.log') #目标文件必须存在

shutil.copy(src, dst)
拷贝文件和权限

1 import shutil
2  
3 shutil.copy('f1.log', 'f2.log')

shutil.copy2(src, dst)
拷贝文件和状态信息

1 import shutil
2  
3 shutil.copy2('f1.log', 'f2.log')

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹

1 import shutil
2  
3 shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除 

七:zipfile与tarfile 模块   压缩与解压

# 压缩
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()
复制代码

 八:编写  打印进度条代码 与   生成随机验证码功能、

打印进度条:
def progress (percent,width=70): if percent>1: percent=1 show_str=('[%%-%d]'%width) %(int(width*percent)*'#') print(' %s %d%%'%(show_str,int(100*percent)),end='') import time recv_size =0 total_size = 111234 while recv_size<total_size: time.sleep(0.1) recv_size+=1024 percent=recv_size/total_size progress(percent)
生成随机验证码
import random

def make_code(n=5):
    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(10))
原文地址:https://www.cnblogs.com/lx3822/p/8745113.html