内置模块

一 collections模块 :数据类型模块

 namedtuple:可命名元组

p=collections.namedtuple('p',['x','y'])
a=p(1,2)
print(a.x+a.y)

 deque:双端队列 1 append:后添加;2 appendleft:前添加;3 pop:从后向前取值;4   popleft:从前到后取值

q=collections.deque([1,2,3,4])
q.append(5)  #后面添加
q.appendleft(7)  #第一个位置添加
q.pop()     #最后一个位置读取
q.popleft()    #第一个把位置开始读取
print(q)

 ordereddict:创建有序的字典

# d=collections.OrderedDict([('a',1),('b',2),('d',3)])
# for i in d.items():print(i)

 defaultdict:默认字典的value值

# values = [11, 22, 33,44,55,66,77,88,99,90]
# dic=collections.defaultdict(list)
# for l in values:
#     if l>66:
#         dic['k1'].append(l)
#     else:
#         dic['k2'].append(l)
# print(dic)

 counter计算字符出现的次数

print(collections.Counter('asasfewruvs'))

二 time模块:时间模块

 time.time():当前时间戳   (计算机识别的时间)   从1970年1月1日00:00:00开始计算

# print(time.time(

 time.strftime():时间字符串  结构化时间转成字符串时间   #(人类识别的时间)

# print(time.strftime('%Y-%m-%d'))

 time.localtime():结构化时间(计算国内时间)   时间戳装成结构化时间(计算国内时间)

# print(time.localtime())

 time.gmtime():结构化时间(计算国际时间)   时间戳转换成结构化时间(计算国际时间)

# print(time.gmtime())

 time.mktime():结构化时间转成时间戳   (机器识别的时间)

# print(time.mktime(time.localtime()))

 time.strptime():字符串时间转成结构化时间 (计算时间)

# time_1=time.strftime('%Y-%m-%d')
# print(time.strptime(time_1,"%Y-%m-%d"))

 

    time.asctime():结构化时间转成字符串时间(转换后有固定的格式)

# print(time.asctime())

 time.ctime():时间戳转成字符串时间(转换后有固定的格式)


# print(time.ctime())

          

    计算时间差:


# import time
# end=time.time()
# start=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
# end_start=end-start
# cha_time=time.localtime(end_start)
# print('已经过去了%s年%s月%s天%s小时%s分种%s秒'%(cha_time.tm_year-1970,cha_time.tm_mon-1,cha_time.tm_mday-1,cha_time.tm_hour-0,cha_time.tm_min-1,cha_time.tm_sec-0))
 
时间日期格式化符合

 %y:两位数的年份

 %Y:四位数的年份

 %m:月份

 %d:天

 %H:24进制的小时

 %I:12进制的小时

 %M:分钟

 %S:秒

 %a:本地简化星期名称

 %A:本地完整星期名称

 %b:本地简化的月份名称

 %B:本地完整的月份名称

 %c:本地相应的日期和时间的表示

 %j:年内的一天

 %p:本地AM或者PM的等价符

 %U:一年中的星期数,星期天为星期的开始

 %w:星期(0-6),星期天为开始

 %W:一年中的星期数,星期一为开始

 %x:本地相应的时间表示

 %X:当前时期的名称

 %%:%本身

‘三 random模块:随机模块

 random:0到1之间的小数

print(random.random())

 uniform:自定义小数范围

print(random.uniform(1,4))

 randint:自定义随机整数的范围(取头取尾)

print(random.randint(1,10))

 randrange:自定义随机整数的范围(取头不取尾)还可以定义步长取

print(random.randrange(1,20,2))

 choice:随机返回一个值

print(random.choice([1,2,3,44,(2,4,6)]))

 sample:随机返回多个值,自定义返回值的个数

print(random.sample([1,2,3,44,(2,4,6)],3))

 shuffle:打乱顺序

l=[1,2,3,4,5,6,7,8,9]
random.shuffle(l)
print(l)

随机验证码

# import random
# def yan(n):
#     ll=''
#     for num in range(n):
#         i=random.randint(0,9)
#         j=chr(random.randint(65,90))
#         z=chr(random.randint(97,122))
#         l=random.choice([str(i),j,z])
#         ll+=l
#     print(ll)
# yan(6)

四 os模块

  os.getcwd:获取当前的工作目录

 os.chdir:改变当前脚本的工作目录

 os.curdir:返回当前目录

 os.pardir:获取当前目录的父目录字符串名

 os.makedirs:可生成多层递归目录

 os.removedirs:递归删除上一级的空目录

 os.mkdir:生成单层目录

 os.rmdir:删除单级空的目录

 os.listdir:列出指定目录下的所有的文件和子目录

 os.remove:删除一个文件

 os.rename:修改文件名/目录名

 os.stat:获取文件/目录信息

 os.sep:输出操作系统特定的路劲分割符

 os.linesep:输出当前平台的行终止符

 os.pathsep:输出用于分割文件路径的字符串

 os.name:输出字符串指示的当前平台

 os.system:运行shell命令直接显示

 os.popen:运行shell命令,获取执行结果

 os.environ:获取系统的环境变量

 os.path.abspath:返回path规范化的绝对路径

 os.path.exists:如果path存在,返回True;相反返回False

 os.path.isabs:如果path是绝对路径返回True

 os.path.isfile:如果是是一个存在的文件返回True

 os.path.isdir:如果是一个存在的目录返回True

 os.path.join:路径拼接

 os.path.getatime:返回所指向文件或者目录最后的访问时间

 os.path.getmtime:返回所指文件或者目录的最后修改时间

 os.path.getsize:返回文件或者目录的大

 五 sys模块

    sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分

 sys.argv:命令行参数list,第一个元素是程序的路径本身

 sys.exit:退出程序

 sys.version:获取python解释器的版本信息

 sys.path:返回模块的 搜索路径

 sys.platform:返回操作系统平台名称

小练习
count=1
while count<10:
    print('ok')
    if count==8:
        #break        #终止了if判断的后面条件,但是while循环还会继续进行
        sys.exit()  #程序在这后面的都结束。直接全部终止
    count+=1
print('ending')

小练习

ret=sys.arge    #["模块.py","fang","666"]
print(ret)   #["sys模块.py",'-u','fang','-p','666']
            #  只有放在-u后面的是用户名,放在-p后面的是用户名密码。
username=ret[1]
password=ret[2]
print(sys.argv)   #显示当前服务器的绝对路径,
print('huijia')
username=input('username:')   #io是一个阻塞状态
password=input('password:')
if username =='fang'and password=='666':
    print('huijia')

sys.path   #显示一堆路径,以列表的形式显示出来
print(sys.path)  #['E:\文本编辑器\pycharm\方杰\目录\模块', 'E:\文本编辑器\pycharm', 'E:\python3.5\python36.zip',
 'E:\python3.5\DLLs', 'E:\python3.5\lib', 'E:\python3.5', 'E:\python3.5\lib\site-packages']
#寻找模块,从当前的路径下开始寻找,如果当前路径下没有,就会挨个的按照列表
# 的顺序寻找下去,如果找到了,就不再寻找。
import re
import hashlib
print(re.findall(r"hello","hello"))

Base_dir=r'E:文本编辑器pycharm方杰阿豪'
sys.path.append(Base_dir)
import lesson1
lesson1.foo()
不管是人家添加还是自己添加的模块,只要有路径,就会寻找到。
View Code

   查找模块的优先级:内置模块(python解释器)---------------》第三方模块,自定义模块(sys.path)

六 序列化模块

     之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。

 什么叫做序列化:将原本的数据类型转换成字符串的过程就叫做序列化;相反将字符串转为非字符串的数据类型就叫做反序列化.在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

 序列化的好处:1以某种存储形式使自定义对象持久化;2 将对象从一个地方传送到另一个地方;3 使程序更具有维护性

 序列化的几个模块:json模块:用于各种开发语言之间的,只能在基本的数据类型上使用.但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

          pickle模块:只能用于python开发中,不过可以对特殊的数据类型进行操作

          shelve模块:只有open一个方法,直接就可以对文件句柄操作。读取的内容是以存入的类型读取的。

json和pickle的四种功能:dump和dumps:序列化,转成字符串,dump用于文件操作;dumps用于网络传输。

            load和loads:反序列化,转换成非字符串(内容中假如要用引号,必须用双引号)。load用于文件操作,loads用于网络传输。

json:

import json
# a={'fan':123,'jie':321}
# with open('a','w',encoding='utf-8')as f:
#     json.dump(a,f)  #序列化写入文件
#
# with open('a')as f:
#     print(json.load(f))  #反序列化读取


# print(type(json.dumps({'fan':123,'jie':321})))  #序列化
# print(type(json.loads('{"fan":123,"jie":321}')))   #反序列化

JSON表示的对象就是标准的JavaScript语言的对象一个子集,JSON和Python内置的数据类型对应如下:

 pickle:

# import pickle
# a={'fan':123,'jie':321}
# with open('a1','wb')as f:
#     pickle.dump(a,f)  #序列化写入文件
# 
# with open('a1','rb')as f:
#     print(pickle.load(f))  #反序列化读取
# 
# 
# print(type(pickle.dumps({'fan':123,'jie':321})))  #序列化
# print(type(pickle.loads(pickle.dumps('{"fan":123,"jie":321}'))))   #反序列化

优点:能支持python中的所有数据类型,所有数据类型之间都可以进行转换的。

 缺点:pickle仅仅用于python数据类型转换,不能在其他语言之间进行使用。

shelve:

# import shelve
# with shelve.open('a2')as f:
#     f['k1']={"fan":123,"jie":321}            直接对文件句柄操作,就可以存入数据
#     f['k2'] = {"fang": 1234, "jie": 3210}          直接对文件句柄操作,就可以存入数据
#     f1=f['k2']              #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
#     print(f1)
#     print(f['k1'])        #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错

 七 

logging 模块

日志模块,为我们记录一些信息

  1 简单的配置方法

1 logging.debug('debug message')
2 logging.info('info message')
3 logging.warning('warning message')
4 logging.error('error message')
5 logging.critical('critical meddage')

默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。

 2 灵活配置日志级别,日志格式,输出位置:

 View Code

3 配置参数:

 View Code

4 logger对象配置

 摘要别人的
 View Code

logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别。

八 

内置模块 hashlib

 1 算发介绍

import hashlib

       Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

      什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

      摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

      摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致

  计算出的摘要完全不同。

     我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

 View Code

     如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

 View Code

    MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

 View Code

  2 摘要算法应用

  任何允许用户登录的网址都会储存用户的用户名和密码,方法是存到数据库表中:

 View Code

  如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

 View Code

考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

 View Code

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

复制代码
hashlib.md5("salt".encode("utf8"))




加盐处理
salt
md5_obj=hashlib.md5("salt"
md5_obj.update("admin")      # saltadmin
复制代码

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

加盐:就是在加密对象前面加上一段内容,在同时进行加密。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

九 

configparser模块

该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。

1 创建文件   如下

复制代码
 1 #文件的基本格式是  例如:
 2 # [DEFAULT]
 3 # ServerAliveInterval = 45
 4 # Compression = yes
 5 # CompressionLevel = 9
 6 # ForwardX11 = yes
 7 #
 8 # [bitbucket.org]
 9 # User = hg
10 #
11 # [topsecret.server.com]
12 # Port = 50022
13 # ForwardX11 = no
14 
15 #configparser使用的格式是:分为三段,每段相当于是一个字典的形式,然后字典里面在包含一个字典
16 #生成文件的方法是
17 #fang=configparser.ConfigParser()    #首先调用模块的对象,然后再赋值给一个对象
18 #fang["DEFAULT"]={"key1":"vales1","key2':"vales2"........}
19 #fang[ "自定义字典名称"]={"key1":"vales1","key2":'vales2".....}
20 #fang["自定义字典名称2”]={"key1":"vales1","key2":vales2"......}
21 #with open("要添加的路劲","w")as f:
22 #   fang.write(f)
23 
24 # import configparser
25 # #例如将下面内容写入到文件中
26 # fang=configparser.ConfigParser()
27 # fang["DEFAULT"]={
28 #         "ServerAliveInterval" :45,
29 #         "Compression" :"yes",
30 #         "CompressionLevel" : 9,
31 #         "ForwardX11" : "yes"
32 # }
33 # fang["bitbucket.org"]={"User": "hg"}
34 # fang["topsecret.server.com"]={"Port" : 50022,"ForwardX11"  :"no"}
35 # with open("yuan.txt","w")as f:
36 #     fang.write(f)
37 #
创建的第一个字段名称必须是DEFAULT名称,后面创建的字段可以自定义名称,第一个字段创建的内容会在后面创建的每一个字段中自动添加上去。
 
复制代码

2 操作文件

复制代码
 1 # #操作文件:读与写操作
 2 # import configparser
 3 # jie=configparser.ConfigParser()
 4 # jie.read("yuan.txt")
 5 # print(fang.sections())   #查字段的信息
 6 #
 7 # import configparser
 8 # jie=configparser.ConfigParser()
 9 # jie.read("yuan.txt")
10 # print('topsecret.server.com' in fang)  #查看字段是否在该字典里
11 #
12 #
13 # import configparser
14 # jie=configparser.ConfigParser()
15 # jie.read("yuan.txt")
16 # print(fang.items("topsecret.server.com"))  #取出某个字段的内容
17 
复制代码

3 查找文件

复制代码
 1 # import configparser
 2 #
 3 # config = configparser.ConfigParser()
 4 #
 5 # #---------------------------查找文件内容,基于字典的形式
 6 #
 7 # print(config.sections())        #  []
 8 #
 9 # config.read('example.ini')
10 #
11 # print(config.sections())        #   ['bitbucket.org', 'topsecret.server.com']
12 #
13 # print('bytebong.com' in config) # False
14 # print('bitbucket.org' in config) # True
15 #
16 #
17 # print(config['bitbucket.org']["user"])  # hg
18 #
19 # print(config['DEFAULT']['Compression']) #yes
20 #
21 # print(config['topsecret.server.com']['ForwardX11'])  #no
22 #
23 #
24 # print(config['bitbucket.org'])          #<Section: bitbucket.org>
25 #
26 # for key in config['bitbucket.org']:     # 注意,有default会默认default的键
27 #     print(key)
28 #
29 # print(config.options('bitbucket.org'))  # 同for循环,找到'bitbucket.org'下所有键
30 #
31 # print(config.items('bitbucket.org'))    #找到'bitbucket.org'下所有键值对
32 #
33 # print(config.get('bitbucket.org','compression')) # yes       get方法取深层嵌套的值
34 #
复制代码

十 

subprocess模块

当我们需要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完成我们需要的操作。

      subprocess模块允许一个进程创建一个新的子进程,通过管道连接到子进程的stdin/stdout/stderr,获取子进程的返回值等操作。 

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.(子进程模块允许您生成新进程,连接到输入/输出/错误管道,并获取其返回代码。)

This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*(此模块旨在替换其他较旧的模块和函数,例如:os.system,os.spawn *,os.popen *,popen2。*,commands *)

这个模块只一个类:Popen。

  1   简单命令

# import subprocess
#
# #  创建一个新的进程,与主进程不同步  if in win: s=subprocess.Popen('dir',shell=True)
# s=subprocess.Popen('ls')
# s.wait()                  # s是Popen的一个实例对象

2 命令带参数

1 # import subprocess
2 # s=subprocess.Popen("Ls-L",shell=True)   #命令带参数

3 控制子进程

当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。刚才我们使用到了一个wait方法

此外,你还可以在父进程中对子进程进行其它操作:

复制代码
# s.poll() # 检查子进程状态
# s.kill() # 终止子进程
# s.send_signal() # 向子进程发送信号
# s.terminate() # 终止子进程
#
# s.pid:子进程号

'''
复制代码

子进程的文本流控制

可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):

复制代码
1 # import subprocess
2 # s=subprocess.Popen("Ls-L",shell=True,stdout=subprocess.PIPE)
3 # print(s.stdout.read())            #拿到一个字节
4 #
5 # import subprocess
6 # s=subprocess.Popen("Ls-L",shell=True,stdout=subprocess.PIPE)
7 # print(s.stdout.read().decode("gbk"))    #进行一个转换
复制代码

ubprocess.PIPE实际上为文本流提供一个缓存区。s1的stdout将文本输出到缓存区,随后s2的stdin从该PIPE中将文本读取走。s2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。
注意:communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成

5 快捷API

复制代码
'''
subprocess.call()

父进程等待子进程完成
返回退出信息(returncode,相当于Linux exit code)


subprocess.check_call()
父进程等待子进程完成
返回0,检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含
有returncode属性,可用try…except…来检查


subprocess.check_output()
父进程等待子进程完成
返回子进程向标准输出的输出结果
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含
有returncode属性和output属性,output属性为标准输出的输出结果,可用try…except…来检查。
复制代码
原文地址:https://www.cnblogs.com/fangjie0410/p/7513046.html