Python-模块

Posted JerryZao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-模块相关的知识,希望对你有一定的参考价值。

一、模块:

  Python中的模块,就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包好可执行的代码。

  文件名就是模块名加上后缀.py,在模块内部,模块名存储在全局变量__name__中,是一个string,可以直接在模块中通过__name__引用到模块名。

  模块分为三类:

    -- 自定义模块

    -- 内置模块

    -- 第三方模块

  导入模块:

    -- import:使导入者以一个整体获取一个模块

    -- from:使导入者从一个模块文件中获取特定的变量名

    -- reload:在不终止Python程序的情况下,提供了一个重新载入模块文件代码的方法

  导入模块的方法:

 1 import module # 会先把module执行一遍(如果里边有可执行程序)
 2 from module.xxx.xxx import xx
 3 from module.xxx.xxx import xx as rename
 4 from module.xxx.xxx import *   # 不推荐使用,因为里边可能有一些代码,跟执行文件里自定义的可执行代码重复,导致覆盖
 5 
 6 
 7 正确的调用方式:
 8 
 9 import cal #当前目录直接调用模块
10 
11 from my_module import cal  # 二层目录调用
12 
13 from web1.web2.web3 import cal  # 多层目录调用
14 
15 from web1.web2.web3.cal import add # 只调用某个方法
16 
17 
18 
19 注意:不支持的调用方式  (调用包就是执行包下的__init__.py文件)
20 from web1.web2 import web3  #这样是执行web3的__init__文件,唯一不支持的调用方式
21 print(web3.cal.add(2,6))

 

  获取模块的路径:

 1 import sys
 2 print(sys.path)
 3 
 4 添加路径:
 5 
 6 import sys
 7 import os
 8 # project_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 9 # sys.path.append(project_path)
10 print(os.path.abspath(__file__)) # 是获取的文件名,路径是pycharm加上的
11 print(os.path.dirname(os.path.abspath(__file__))) # 获取文件的路径
12 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #获取上一层目录

 

  第三方模块:

 1 #先安装 gcc 编译和 python 开发环境
 2 yum install gcc
 3 yum install python-devel
 4  5 apt-get python-dev
 6  
 7 #安装方式(安装成功后,模块会自动安装到 sys.path 中的某个目录中)
 8 yum
 9 pip
10 apt-get
11 ...
12 #进入python环境,导入模块检查是否安装成功
第三方模块(linux)

 

二、包(package)

  如果不同的人编写的代码模块名相同怎么办?为了避免冲突,Python引入了按目录来组织模块的方法,称为包。

  

  如图所示,两个cal.py冲突了,但是功能不同,所以给两个模块选择一个顶层包(不能重名),在调用就不会冲突了。

  --注--:

    请注意:每个包目录下来都会有一个__init__.py的文件,这个文件必须是存在的,否则,Python就不把这个目录当成普通目录,而不是一个包,__init__.py可以是空文件,也可以有python代码,__init__.py本身就是一个文件,它的模块名就是对应的包名,它一般由于做接口文件。

    调用包就是执行包下的__init__.py文件

三、time模块  

1 时间有三种表达方式:
2 
3 时间戳: unix元年到现在------>time.time()
4 格式化的字符串:如:2016-12-12 10:10------->time.strftime(\'%Y-%m-%d\')
5 结构化时间:元组 ------>time.struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)    即:time.localtime()

 

  

 1 import time
 2 
 3 # 1、时间戳
 4 print(time.time())
 5 
 6 # 2、localtime()
 7 print(time.localtime())  # 空参
 8 ##time.struct_time(tm_year=2016, tm_mon=9, tm_mday=11, tm_hour=0, tm_min=38, tm_sec=39, tm_wday=6, tm_yday=255, tm_isdst=0)
 9 
10 print(time.localtime(1422222222)) # 指定时间戳
11 
12 # 3、gmtime()
13 print(time.gmtime()) # gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。
14 
15 
16 # 4、mktime()
17 print(time.mktime(time.loacltime())) #将结构化时间转换为时间戳
18 
19 # 5、asctime()
20 print(time.asctime()) # 将结构化时间转变为:\'Sun Jun 20 23:21:05 1993\'
21 默认参数是time.localtime()
22 
23 # 6、ctime()
24 print(timectime()) #将时间戳转化为:\'Sun Jun 20 23:21:05 1993\'
25 默认参数是time.time()
26 
27 # 7、strftime()
28 print(time.strftime(format[,t])) #结构化时间转化为 字符串时间
29 默认参数time.localtime()
30 print(time.strftime(\'%Y-%m-%d %X\',time.localtime())) # 2018-03-26 19:11:36
31 
32 # 8、strptime()
33 print(time.strptime())# 字符串时间转化为结构化时间
34 print(time.strptime(\'2016:12:23:17:20:20\',\'%Y:%m:%d:%X\')) # time.struct_time(tm_year=2016, tm_mon=12, tm_mday=23, tm_hour=17, tm_min=20, tm_sec=20, tm_wday=4, tm_yday=358, tm_isdst=-1)
35 
36 # 9、sleep()
37 
38 # 10、clock()
39 这个需要注意,在不同的系统上含义不同。
40 在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。
41 而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间,即两次时间差

 

        记住如下图即可:

 

    ---注---    

1 import datetime
2 print(datetime.datetime.now())
3 ##2018-03-27 17:47:07.211182

四、random模块  

  随机数模块:

 1 import random
 2  
 3 print(random.random())          #用于生成一个0到1的随机符点数: 0 <= n < 1.0
 4 print(random.randint(1,2))      #用于生成一个指定范围内的整数 [1,2]
 5 print(random.randrange(1,10))   #从指定范围内,按指定基数递增的集合中获取一个随机数 [1,10)
 6 print(random.uniform(1,10))     #用于生成一个指定范围内的随机符点数 9.49909962942907
 7 print(random.choice(\'nick\'))    #从序列中获取一个随机元素 c
 8 li = [\'nick\',\'jenny\',\'car\',]
 9 random.shuffle(li)              #用于将一个列表中的元素打乱
10 print(li)
11 li_new = random.sample(li,2)    #从指定序列中随机获取指定长度的片断(从li中随机获取2个元素,作为一个片断返回)
12 print(li_new)

   示例:验证码  查看:http://www.cnblogs.com/JerryZao/p/8659024.html

 五、os模块

  os模块是与操作系统交互的一个接口 

 1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
 2 os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
 3 os.curdir  返回当前目录: (\'.\')
 4 os.pardir  获取当前目录的父目录字符串名:(\'..\')
 5 os.makedirs(\'dirname1/dirname2\')    可生成多层递归目录
 6 os.removedirs(\'dirname1\')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 7 os.mkdir(\'dirname\')    生成单级目录;相当于shell中mkdir dirname
 8 os.rmdir(\'dirname\')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
 9 os.listdir(\'dirname\')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10 os.remove()  删除一个文件
11 os.rename("oldname","newname")  重命名文件/目录
12 os.stat(\'path/filename\')  获取文件/目录信息
13 os.sep    输出操作系统特定的路径分隔符,win下为"\\\\",Linux下为"/"
14 os.linesep    输出当前平台使用的行终止符,win下为"\\r\\n",Linux下为"\\n"
15 os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
16 os.name    输出字符串指示当前使用平台。win->\'nt\'; Linux->\'posix\'
17 os.system("bash command")  运行shell命令,直接显示
18 os.environ  获取系统环境变量
19 os.path.abspath(path)  返回path规范化的绝对路径
20 os.path.split(path)  将path分割成目录和文件名二元组返回
21 os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
22 os.path.basename(path)  返回path最后的文件名。如何path以/或\\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path)  如果path是绝对路径,返回True
25 os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
26 os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
27 os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28 os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
29 os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

 

  ps1、os.stat() 

 1 stat 结构:
 2 
 3 st_mode: inode 保护模式
 4 st_ino: inode节点号。
 5 st_dev: inode驻留的设备。
 6 st_nlink: inode 的链接数。
 7 st_uid: 所有者的用户ID。
 8 st_gid: 所有者的组ID。
 9 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
10 st_atime: 上次访问的时间。
11 st_mtime: 最后一次修改的时间。
12 st_ctime: 创建时间,由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

 

六、sys模块

1 sys.argv           命令行参数List,第一个元素是程序本身路径
2 sys.exit(n)        退出程序,正常退出时exit(0)
3 sys.version        获取Python解释程序的版本信息
4 sys.maxint         最大的Int值
5 sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform       返回操作系统平台名称
1 import time sys
2 
3 for i in range(100):
4     sys.stdout.write("*")
5     time.sleep(1)
6     sys.stdout.flush()
进度条

 

七、json 和 pickle模块

  用于序列化的两个模块;

    json:用于字符串和Python数据类型间的进行转换

    pickle:用于Python特有的类型 和P一条红的数据类型间的转换 

    之前学过eval内置方法,可以将字符串转换为python对象,但是局限性很大,一般eval只用于字符串表达式。

  什么是序列化:

    我们把对象(变量)从内存中变为可存储或可传输的过程称之为序列化。

    序列化之后,就可以吧序列化后的内容写入磁盘,或者通过网络传输到别的机器上

  json模块 提供了四个功能:dumps  dump  loads load

  pickle模块也是一样的四个功能。

    dump() 函数接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存到给定的文件中,当我们使用load()函数从文件中读取已保存的对象时,picle知道如何恢复这些对象到他们本来的格式

    dumps() 函数执行和dump() 函数相同的序列化,取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据

    loads() 函数执行和load() 函数一样的反序列化,取代接受一个流对象并去文件都序列化后的数据,它就收包含序列化后的数据的str对象,直接返回的对象

         

  eval()方法:

    1、

1 import json
2 
3 dic = \'{"jakc":12}\' 
4 f = open(\'c.txt\',\'w\')
5 f.write(dic)

    2、

1 f = open(\'c.txt\',\'r\')
2 data = f.read()
3 print(type(data))
4 data1 = eval(data)
5 print(data1[\'jakc\'])

  json模块:

    1、把字典转换成json形式的字符串写入文件中 (两种方法效果一样,只是写法不同而已)

 1 #-----------方法一--------推荐使用
 2 
 3 dic = {\'age\':12}
 4 dic = json.dumps(dic)
 5 print(dic) # {"age": 12} 内部都是用双引号,json格式
 6 f = open(\'c.txt\',\'w\')
 7 f.write(dic)
 8 f.close()
 9 
10 #-----------方法二
11 
12 dic = {\'age\':13}
13 f = open(\'d.txt\',\'w\')
14 json.dump(dic,f)

 

    2、json反序列化 

 1 把文件中json类型的字符串读取出来转换成字典
 2 
 3 #------------------方法一---推荐
 4 f = open(\'d.txt\',\'r\')
 5 a = json.loads(f.read())
 6 print(a)
 7 print(type(a))
 8 
 9 #------------------方法二
10 f = open(\'c.txt\',\'r\')
11 b = json.load(f)
12 print(b)
13 print(type(b))

 

   --注---

1 import json
2 #dct="{\'1\':111}"#json 不认单引号
3 #dct=str({"1":111})#报错,因为生成的数据还是单引号:{\'one\': 1}
4 
5 dct=\'{"1":"111"}\'
6 print(json.loads(dct))
7 
8 #conclusion:
9 #        无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads

 

  

json的dumps,loads,dump,load功能总结:

json.dumps(x)    把python的(x)原对象转换成json字符串的对象,主要用来写入文件。

json.loads(f)       把json字符串(f)对象转换成python原对象,主要用来读取文件和json字符串

json.dump(x,f)  把python的(x)原对象,f是文件对象,写入到f文件里面,主要用来写入文件的

json.load(file)  把json字符串的文件对象,转换成python的原对象,只是读文件

  pickle模块

     pickle转换后的结果是bytes    

1 pickle序列化:
2 
3 dic = {\'name\':\'jakc\',\'age\':12}
4 j = pickle.dumps(dic)
5 f = open(\'e.txt\',\'wb\')
6 f.write(j)    # 等价pickle.dump(fic,f)
7 f.close()

 

1 pickle反序列化:
2 
3 f = open(\'e.txt\',\'rb\')
4 data = pickle.loads(f.read()) # 等价 data = pickle.load(f)
5 print(data)

 

  Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

八、shelve模块

  shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写,key必须是字符串

# 添加键值对到文件中,会生成三个文件,并写入字典内容

import shelve

f = shelve.open(r\'sssss\') # 目的:将一个字典写入文本 f={}
print(f)
f[\'a1\']= {\'name\':\'alex\',\'age\':12}
f[\'a2\']= {\'name\':\'jakc\',\'age\':12}
f[\'b1\']= {\'a\':\'aa\',\'b\':\'bb\'}
f.close()




-----------------------------------------------------------------------------
会生成三个文件:sssss.dat,sssss.dir,sssss.bak,其中sssss.bak中内容如下:
\'a1\', (0, 42)
\'a2\', (512, 42)
\'b1\', (1024, 42)

 

1 # 取值:
2 
3 f = shelve.open(r\'sssss\')
4 print(f.get(\'a1\')[\'name\'])

 

九、xml模块

  xml 是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但是json简单。

  xml的格式如下:

 1 <?xml version="1.0"?>
 2 <data>   #根
 3     <country name="Liechtenstein">  #节点
 4         <rank updated="yes">2</rank>
 5         <year>2008</year>
 6         <gdppc>141100</gdppc>
 7         <neighbor name="Austria" direction="E"/>  
 8         <neighbor name="Switzerland" direction="W"/>  
 9     </country>
10     <country name="Singapore">     #节点
11         <rank updated="yes">5</rank>
12         <year>2011</year>
13         <gdppc>59900</gdppc>
14         <neighbor name="Malaysia" direction="N"/>
15     </country>
16     <country name="Panama">      #节点
17         <rank updated="yes">69</rank>
18         <year>2011</year>
19         <gdppc>13600</gdppc>
20         <neighbor name="Costa Rica" direction="W"/>
21         <neighbor name="Colombia" direction="E"/>
22     </country>
23 </data>
24 
25 xml数据
样例

  xml在各个语言里都是支持的,在python中可以使用xml模块操作xml文件 。

 1 # 基本操作1:
 2 
 3 import xml.etree.ElementTree as ET
 4 
 5 tree = ET.parse("test.xml") # 获取一个xml文件对象
 6 root = tree.getroot()
 7 print(root.tag) # 获取跟节点的标签 data
 8 
 9 遍历xml文档
10 for i in root:
11     print(i.tag,i.attrib) # 根节点下的标签,一级属性名,属性值
12     for j in i:
13         print(j.tag,j.attrib) # 在往下一层的节点,和属性
14 
15 只遍历year节点
16 for i in root.iter(\'year\'):
17     print(i.tag,i.text)
18 
19 ----->
20 year 2008
21 year 2011
22 year 2011

 

 1 # 基本操作2:
 2 
 3 import xml.etree.ElementTree as ET
 4 
 5 tree = ET.parse("test.xml") # 获取一个xml文件对象
 6 root = tree.getroot()
 7 
 8 # 修改
 9 for i in root.iter(\'year\'):
10 Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段

python之模块和包

python中的模块

Python 常用模块学习

python之模块和包

Python 八Python模块