python常用模块

 模块介绍     

   

一个完整的的python文件既是一个模块:
    文件:物理上组织方式math.py
    模块:逻辑上的组织方式math
python通常用import 模块1,模块2,...的方式将现成模块中的函数、类等重用到其他代码块中.

模块分为三种:

  • 自定义模块
  • 内置标准模块(又称标准库)
  • 开源模块

1.time & datetime 模块

2.random 随机数模块

3. logging 日志模块

4.os & sys 模块

5. configparser 模块

6.re 正则模块

7.haslib 模块

8.shutil 模块

9. xml 模块

10.shelve 模块

11. 反射和一些特殊变量 

 

 

 1 import time
 2 
 3 print(time.time())  # 时间戳
 4 t2=time.strptime("2016/29/11",'%Y/%d/%m')
 5 
 6 print(time.mktime(t2))  # 转成时间戳
 7 
 8 print(time.altzone)#返回与utc时间的时间差,以秒计算
 9 print(time.asctime()) #返回时间格式"Fri Aug 19 11:14:16 2016"
10 t=time.localtime()  # 返回struct格式的本地时间,每个元素可以单独对象使用
11 print(t.tm_year) 
12 print(t.tm_mon)
13 print(t.tm_mday)
14 print(time.gmtime()) # utc time,格式也是strucct,和本地时间有时间差
15 
16 #把时间字符串转换成struct格式的时间对象,后面字符串时间参数是告诉第一个参数时间格式是什么样的
17 print(time.strptime("2016-11-12 12:23","%Y-%m-%d %H:%M"))
18 print(time.strptime("2016/29/11",'%Y/%d/%m'))
19 
20 tt=time.strftime("%Y-%m-%d.log",time.localtime())  
21 
22 print(tt)
23 
24 
25 #时间加减
26  import datetime
27 
28 print(datetime.datetime.now())
29 print(datetime.datetime.now()+datetime.timedelta(days=2)) #当前时间+2天
30 print(datetime.datetime.now()+datetime.timedelta(days=-2)) #当前时间-2天
31 print(datetime.datetime.now()+datetime.timedelta(hours=2)) #当前时间+2小时
32 print(datetime.datetime.now()-datetime.timedelta(hours=2))  #当前时间-2小时
33 now=datetime.datetime.now()
34 print(now.replace(month=1,day=1))    # 把当前时间的月份和天替换掉
35 #把struct时间对象,转换成字符串
1.time & datetime

 

2.random 随机数模块

 1 import random
 2 
 3 print(random.random()) # 随机生成一个数
 4 print(random.randrange(1,200)) # 在指定范围内随机生成一个数,不包含200
 5 print(random.randint(1,5))  # 在指定范围内随机生成一个整数
 6 print(random.sample(range(100),5))   # 从前面迭代数据里,随机选择5个值,组成一个列表
 7 
 8 # 随机验证码的例子,生成包含字母的6位随机验证码:
 9 checkcode = ''
10 for i in range(4):
11     current = random.randrange(0,4)
12     if current != i:
13         temp = chr(random.randint(65,90))  # 转换成A-Z之间的任意一个字母
14     else:
15         temp = random.randint(0,9)
16     checkcode += str(temp)
17 print(checkcode)

 

3. logging 日志模块


     很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别下面我们看一下怎么用:
简单的用法:
 1 import logging
 2 # 日志的五个级别,分别由低到高
 3 logging.debug('debug-hello')
 4 logging.info('info-lello')  #日志默认level,级别比它高的才会在屏幕输出
 5 logging.warning('hello-warning')
 6 logging.error("error-hello")
 7 logging.critical("critical-hello")
 8 
 9 # 输出:
10 
11 WARNING:root:hello-warning
12 ERROR:root:error-hello
13 CRITICAL:root:critical-hello

把日志存放到文件中:

      其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了:

logging.basicConfig(filename='example.log',level=logging.INFO)
logging.warning('is when this event was logged.')

# 加入时间
logging.basicConfig(filename='example.log', level=logging.INFO,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

# 加入时间运行效果
12/13/2016 04:04:50 PM is when this event was logged.

 

如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识 

Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:

logger提供了应用程序可以直接使用的接口;

handler将(logger创建的)日志记录发送到合适的目的输出;

filter提供了细度设备来决定输出哪条日志记录(不常用);

formatter决定日志记录的最终输出格式。

logger
每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模块可以这样:
LOG=logging.getLogger(”chat.kernel”)

Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别

 

handler

handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象


每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
1) logging.StreamHandler  # 输出到屏幕
使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
StreamHandler([strm])
其中strm参数是一个文件对象。默认是sys.stderr


2) logging.FileHandler(filename[,mode])      # 输出到文件

StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文件名,必须指定一个文件名。
mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。

3) logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。


4) logging.handlers.TimedRotatingFileHandler
这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
interval是时间间隔。
when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时代表星期一)
midnight 每天凌晨

 

 1 import logging
 2 
 3 logg=logging.getLogger('TEST-LOG')   #   生成一个日志对象
 4 logg.setLevel(logging.DEBUG)
 5 
 6 ch=logging.StreamHandler()  # 输出到屏幕的handler,用handler来指定日志输出到的对象
 7 ch.setLevel(logging.WARNING)
 8 
 9 fh=logging.FileHandler('access.log') # 指定输出到文件的handler
10 fh.setLevel(logging.ERROR)
11 
12 fomatter=logging.Formatter('%(asctime)s:%(lineno)s %(message)s')  # 输出格式
13 ch.setFormatter(fomatter)
14 fh.setFormatter(fomatter)
15 
16 logg.addHandler(fh)  #  把handler添加到日志对象中去,告诉日志我应该输出到那里(文件/屏幕/邮件....)
17 logg.addHandler(ch)
18 
19 logg.warning("warning happend.......")
20 logg.error("error happend...")

 日志文件可以按时间和大小来分隔文件存放:

 1  #每5S生成一个日志文件,保留3份
 2 fh=handlers.TimedRotatingFileHandler(filename='log_file.log',when="S",interval=5,backupCount=3,encoding='utf-8')
 3 fomatter=logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
 4 fh.setFormatter(fomatter)
 5 logge.addHandler(fh)
 6 logge.warning('test1')
 7 time.sleep(2)
 8 logge.warning('test2')
 9 
10 # 按文件大小自动截断日志文件
11 #fh=handlers.TimedRotatingFileHandler(filename='log_file.log',backupCount=3,maxBytes=10,encoding='utf-8')

 

4. os 和 sys 模块

   OS模块常用方法

 

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

 

 

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       返回操作系统平台名称
7 sys.stdout.write('please:')
8 val = sys.stdin.readline()[:-1]

 

 5.configparser 模块

       用于对特定的配置进行操作。

 1 # 配置文件tt.ini
 2     [section1]
 3       k1 = 123
 4       k2 = tt1
 5    [section2]
 6       k1 = v1
 7 
 8 # 配置文件格式有要求,section节点要用[],下面的元素信息要用k,v形式表达
 9 
10 # -*- coding:utf-8 -*-
11 # Author:pwj
12 
13 import configparser
14 
15 config1=configparser.ConfigParser()
16 config1.read("tt.ini")
17 print(config1.sections())  # 以列表形式输出配置文件里的所以section节点;['section1', 'section2']
18 option=config1.options('section1') # 获取section1节点下的所有key;
19 print(option)  # ['k1', 'k2']
20 item_list=config1.items("section1") # 获取section1节点下的所有k,v对;
21 print(item_list)  # [('k1', 'v1'), ('k2', 'v2')]
22 
23 val=config1.get('section1','k1')  # 获取section1节点k1的value值
24 print(val)  # 123
25 val2=config1.getint('section1','k1') # 如果k1的value是int形式则可以直接转换成int数字
26 print(val2)
27 # 添加
28 ss2=config1.has_section("test")  # 判断配置文件里是否有test节点,有返回true,or false
29 config1.add_section("test")  # 添加节点
30 config1.set('test','k1','value123')  # 在test节点下添加k,v对
31 config1.write(open('tt.ini','w'))  # 修改写到配置文件中
32 # 删除
33 ss=config1.remove_option('section1','k2')  # 删除section1下面的k2元素
34 config1.write(open('tt.ini','w')) # 因为配置文件读在内存了,为了修改生效要写回原来配置文件中
35 
36 
37 # 运行后的tt.ini :
38 [section1]
39 k1 = 123
40 k2 = tt1
41 [section2]
42 k1 = v1
43 
44 [test]
45 k1 = value123

 6.re 正则模块

1 最常用的匹配语法:
2 re.match 从头开始匹配
3 re.search 匹配包含
4 re.findall 把所有匹配到的字符放到以列表中的元素返回
5 re.splitall 以匹配到的字符当做列表分隔符
6 re.sub      匹配字符并替换

 1 orr='hasaabc dfouenererehalaabc rer2e32434'
 2 r1=re.match('h\w+',orr)  # 从头开始匹配第一个满足条件的字符串
 3 r2=re.match('h(\w+)',orr)  # 加()表示分组匹配
 4 r=re.match('h(?P<name>\w+)',orr)
 5 print(r1.group())  # 获取匹配到的结果 hasaabc
 6 print(r2.groups()) # 获取模型中匹配到的分组结果('asaabc',)
 7 print(r.groupdict())  # 获取模型中匹配到的分组结果,加入?p表示后面<>里是key ;{'name':'asaabc'}
 8 rr=re.findall("h(\w+)",orr) # 把所有匹配到的字符放到以列表中的元素返回  
 9 print(rr)  # 加括号表示分组,先匹配'h\w+',再在返回的结果中把满足分组的字符返回 ['asaabc', 'alaabc']     
10 rr2=re.findall('h(\w+)a(ab)c',orr)      #[('as', 'ab'), ('al', 'ab')]  
11 print(rr2)
12 
13 he="hello alex bcd alex lge alex acd 19"
14 r1=re.split('alex',he) # 以匹配到的字符串作为列表分隔符  ['hello ', ' bcd ', ' lge ', ' acd 19']
15 r2=re.split("(alex)",he)   # ['hello ', 'alex', ' bcd ', 'alex', ' lge ', 'alex', ' acd 19']
16 r3=re.split('a(le)x',he)  # ['hello ', 'le', ' bcd ', 'le', ' lge ', 'le', ' acd 19']
17 r4=re.split('a(le)x',he,1)  # 后面的参数1表示只匹配一次,['hello ', 'le', ' bcd alex lge alex acd 19']
18 print(r1)
19 print(r2)
20 print(r3)

t1='22rerenr#trtpeenrerer'
print(re.search('\d',t1).group()) # \d 匹配一个数字0-9
print(re.search('2\w',t1).group()) # \w 匹配A-Za-z0-9之间的任意一个字符
print(re.search('\W',t1).group()) # 返回的是 #, \W 匹配的是非A-Za-z0-9之间的任意一个字符
print(re.search('\D',t1).group()) # \D 匹配非0-9

tt=re.search('\dr',t1).group() # 匹配数字\d
print(tt)
print(re.search("en",t1).group()) # 从头开始匹配,返回第一次匹配到的字符,后面不再继续匹配
print(re.findall("en",t1)) # 返回所有匹配到的字符串,返回结果是个列表
print(re.match("en",t1)) #从第一个字符位置开始匹配,后面即使有要找的字符串也不再进行匹配,如果没有就返回None
print(re.sub("en",'ppp',t1)) # 替换找到的字符串,找到几个就替换几个,第一参数是old字符串,第二参数是new字符串,第三个参数是需要操作的字符串
print(re.sub("en",'ppp',t1,1)) # 最后面一个数字表示最多只替换几次
print(re.subn('en','ppp',t1)) # 返回的是一个二元组,会返回总共替换了几次
print(re.split('en',t1)) # 把"en" 当作列表分隔符,返回的是列表






 

 常用匹配规则:

 1 '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
 2 '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
 3 '$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
 4 '*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
 5 '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
 6 '?'     匹配前一个字符1次或0次
 7 '{m}'   匹配前一个字符m次
 8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
 9 '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11  
12  
13 '\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
14 '\Z'    匹配字符结尾,同$
15 '\d'    匹配数字0-9
16 '\D'    匹配非数字
17 '\w'    匹配[A-Za-z0-9]
18 '\W'    匹配非[A-Za-z0-9]
19 's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
20 [xyz]     字符集,匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”
21 [^xyz]    反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”
22 [a-z]    字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母

 

7. haslib 模块

   用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

 1 import hashlib
 2  
 3 # ######## md5 ########
 4  
 5 hash = hashlib.md5()  # 不可逆的加密算法
 6 hash.update('admin')
 7 print(hash.hexdigest())
 8  
 9 # ######## sha1 ########
10  
11 hash = hashlib.sha1()
12 hash.update('admin')
13 print(hash.hexdigest())
14  
15 # ######## sha256 ########
16  
17 hash = hashlib.sha256()
18 hash.update('admin')
19 print(hash.hexdigest())
20  
21  
22 # ######## sha384 ########
23  
24 hash = hashlib.sha384()
25 hash.update('admin')
26 print(hash.hexdigest())
27  
28 # ######## sha512 ########
29  
30 hash = hashlib.sha512()
31 hash.update('admin')
32 print(hash.hexdigest())

 

8.shutil 模块

     shutil高级的 文件、文件夹、压缩包 处理模块

 1 import shutil
 2 
 3 f=open('ww')
 4 f1=open('rr','w')
 5 shutil.copyfileobj(f,f1)  # copy文件对象里的内容源到目的
 6 
 7 # 直接copy源文件到目的文件里
 8 #shutil.copy(r'D:\myUI\index.html','test')  
 9 
10 # 把源文件夹copy到目的文件夹里
11 #shutil.copytree(r'C:\Users\pwj\PycharmProjects\S13day1\day1','day1_new') 
12 
13 # 把root_dir目录打包压缩到C:\Users\pwj\目录下的day1.zip文件
14 shutil.make_archive(r"C:\Users\pwj\day1" ,format='zip',root_dir=r'C:\Users\pwj\PycharmProjects\S13day1\day1')
15 
16 
17 import zipfile
18 # 压缩
19 #zip_obj=zipfile.ZipFile(r"D:\zip_test.zip",'w')  # 可以压缩文件,不能压缩目录
20 #zip_obj.write('test') # 添加压缩文件里
21 #zip_obj.write('rr')   # 添加压缩文件里
22 
23 
24 import tarfile
25 # tar 只打包,不压缩
26 tar=tarfile.open(r"D:\ee.tar",'w')
27 tar.add('rr')  # 可以把文件添加到打包文件里
28 tar.add(r"D:\zip_test.zip")  # 可以添加
29 # 注意C:\Users\pwj\PycharmProjects\S13day1\day1这是个目录,下面有很多的文件
30 
31 # 把前面那个目录,以day1文件夹命名,添加到打包文件中
32 tar.add(r"C:\Users\pwj\PycharmProjects\S13day1\day1",arcname='day1') 
33 
34 # 可以打包目录,把绝对路径添加到打包文件里了,就是说要打开day1要逐层点进去
35 tar.add(r"C:\Users\pwj\PycharmProjects\S13day1\day1")  

 9. xml 模块 


 xml能解析2种类型的xml格式,分别为:xml的配置文件和xml格式的字符串
xml的元素统称为elment
 1 # -*- coding:utf-8 -*-
 2 # Author:pwj
 3 import xml.etree.ElementTree as ET
 4 #
 5 
 6 # 一.解析xml配置文件
 7 #tree = ET.parse("tst.xml")  # 打开一个xml文件
 8 #root = tree.getroot() # 获取xml文件的根节点
 9 #print(root.tag)  # 打印根据的名称
10 
11 # 二.解析 xml格式编写的字符串文件
12 tree_str=open("xml_str.txt",'r').read()
13 root= ET.XML(tree_str)   # 将字符串解析成特殊对象,root代指xml文件的根节点
14 
15 
16 
17 # 遍历xml文档
18 for child in root:
19     print(child.tag, child.attrib)  #  打印根节点下面的第一层子节点名和属性
20     for i in child:
21         print(i.tag,i.attrib,i.text)   # 再子一层,打印标签,标签属性,标签内容
22 
23 
24 # 取出xml里面的所有年
25 for node in root.iter('year'):
26     print(node.tag,node.text)
27 
28 
29 # 修改
30 for node in root.iter("year"):
31     new_year=int(node.text)+1
32     node.text=str(new_year)
33     node.set('ppp',"YES")  #  给含有year的标签加一个属性ppp=yes
34 tree.write("testxml")  # 修改写入新xml文件里
35 '''
36 
37 # 删除node
38 for country in root.findall('country'):
39    print(country.find('rank').text)
40    if int(country.find('rank').text) > 50:
41        root.remove(country)

 

10. shelve 模块

     shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式:

 1 ----------------------------s1.py -------写--------------------------
 2 
 3 import shelve
 4 
 5 d=shelve.open('shelve_test') # 打开一个文件
 6 
 7 def stu_data(name,age):
 8     print("register stu",name,age)
 9 
10 info={'name':'jony',"age":33}
11 name=['alex','rain','coco']
12 d['test']=name  # 存放列表数据
13 d['info']=info   # 存的是字典
14 d['func']=stu_data  # 存的是函数
15 d.close()
16 
17 
18 
19 ---------------------分割线,s2.py------读----------------------------------
20 import shelve
21 def stu_data(name,age):
22     print("stu",name,age)
23 
24 f=shelve.open("shelve_test") # 打开一个文件
25 print(f['test'])  # 读s1.py文件存放的数据
26 print(f['func']) # 这个存的是函数内存地址,s1.py里的读不到
27 print(f['info'])  # 读的是字典数据
28 print(f['func']("test",30))  # 函数调用执行结果

 

 

11.反射和一些特殊变量

 特殊变量及其含义:

 1 __doc__
 2 
 3 print(__doc__)   # 获取文件顶层的注释 
 4 
 5 __cached__
 6 print(__cached__)   # 获取文件pyc文件所在的位置
 7  
 8 __file__
 9 print(__file__)   # 获取当前文件所在的路径
10  
11 __package__
12 print(index.__package__)  # 获取index文件所在的包名
13  
14 __name__
15 当__name__=__main__时,如果该文件是一个程序的入口,那么其他模块导入该文件时候不会启动程序的运行,只有在他自己文件里执行时才会运行

 

反射:

反射就是利用字符串的形式去对象(默认)中操作(寻找/检查/删除/设置)成员

方法:getattr(),hasattr(),setattr(),delattr()

    

 1 # 假设在index.py  模块里---------------------------
 2 import commm  # 导入commm模块
 3 def run():
 4     inp=input("please input access url>>>")
 5     #func = getattr(commm,"login")  # 去commm模块去找login成员,后面参数是字符串形式所以下面语句效果一样
 6    # func=getattr(commm,inp)  # 获取commm模块里的inp成员,不存在会出错
 7     if hasattr(commm,inp):     # 查看commm模块里是否存在inp成员,存在返回true,or false
 8         func= getattr(commm,inp)
 9         func()
10     else:
11         print('404')
12 run()

 

 

 

posted @ 2016-12-22 15:39  远匿  阅读(713)  评论(0编辑  收藏  举报