模块,用一砣代码实现了某个功能的代码集合。

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

如:os 是系统相关的模块;file是文件操作相关的模块

模块分为三种:

  • 自定义模块,文件或文件夹
  • 内置模块
  • 开源模块

一 第三方模块安装

 # python 安装第三方模块
# 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+python的scripts路径
(1) python管理工具 pip
# python3 -m pip install requests # 3版本安装 (2) 源码安装
解压
cmd
进到你下载的包路径
python setup.py install #选择你要安装的Python版本。

windows下安装开源模块 

报错

 pip install django
Fatal error in launcher: Unable to create process using '"'

解决方法

 python -m pip install package
 如果找不到pip命令可以去scripts目录下
安装报错
C:\Python35\Scripts
λ pyip install django
Fatal error in launcher: Unable to create process using '"' C:\Python35\Scripts
λ pip install django
Fatal error in launcher: Unable to create process using '"' 解决 python -m pip install package C:\Python35\Scripts
λ python -m pip install requests
Collecting requests
Downloading requests-2.10.0-py2.py3-none-any.whl (506kB)
100% |████████████████████████████████| 507kB 144kB/s
Installing collected packages: requests
Successfully installed requests-2.10.0
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command. C:\Python35\Scripts
λ piython -m pip install django
Collecting django
Downloading Django-1.9.6-py2.py3-none-any.whl (6.6MB)
100% |████████████████████████████████| 6.6MB 64kB/s
Installing collected packages: django
Successfully installed django-1.9.6
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command. C:\Python35\Scripts
λ python3 -m pip install django
Collecting django
Using cached Django-1.9.6-py2.py3-none-any.whl
Installing collected packages: django
Successfully installed django-1.9.6
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

二 自定义模块

也就是自己写的python脚本,而目录就是所谓的包

1 定义模块

 2 导入模块

Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:

 import module
from module.xx.xx import xx
from module.xx.xx import xx as rename
from module.xx.xx import *

2 .2 导入模块后如何调用

 第一种:
from lib import account
ret = account.login() # 导入模块,这里方法调用必须用模块
print(ret)
第二种:
from lib.account import login #这里如果直接导入方法,需要包.模块
ret = login()
print(ret)
第三种
import lib.account #如果是直接import
ret = lib.account.login() #调用时候需要从头开始写
print(ret)
第四种:
from lib.account import login as l #as使用
ret = l()
print(ret) account 文件
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ def login():
return "login" def register():
return "register" def logout():
return "logout"

3 模块默认查找路径

导入模块其实就是告诉Python解释器去解释那个py文件  

  • 导入一个py文件,解释器解释该py文件
  • 导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】

那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path,根据sys.path下的路径去找。

 import sys
print(sys.path) C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/mk.py
['E:\\py\\55\\learn-python\\oldboy\\6',
  'E:\\py\\55\\learn-python\\oldboy',
  'C:\\Python35\\python35.zip',
  'C:\\Python35\\DLLs',
  'C:\\Python35\\lib',
  'C:\\Python35',
  'C:\\Python35\\lib\\site-packages']

4 将某个路径加入到环境变量

如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。

 # 将d盘写的一个脚本加入到sys路径,这样D盘下面的py文件就可以作为模块直接用。
import sys
sys.path.append("D:")
import buy
ret = buy.fun()
print(ret)<br><br>
 import sys
import os pre_path = os.path.abspath('../')
sys.path.append(pre_path)

三 内置模块

1 、os

用于提供系统级别的操作

 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ls
os.remove() 删除一个文件 rm
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息,包含文件大小。
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示,模拟一个人的操作,
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
 #!/usr/bin/env python
# _*_ coding:utf-8 _*_ import os print(os.getcwd())
# 测是 chdir 切换目录,切换到上级目录
# pwd =os.getcwd()
# li = pwd.split("\\")
# del li[-1]
# pwd='\\'.join(li)
# print(pwd)
# os.chdir(pwd)
# print(os.getcwd()) print(os.curdir) # 返回.
a = os.pardir
print(a) # 返回是..
# os.makedirs("a/b/c")
# os.makedirs("a/b") #在本层目录下创建a/b
# os.removedirs("a/b") # b为空,删除b后,a也为空,则都删除 否则哪级不为空就会报错
# os.mkdir("b") #创建目录
# print(os.listdir('a/b')) #列出目录内一层的内容包括隐藏目录
# os.remove('a/b/圣达菲.py') # 删除b下的文件
# os.rmdir("b")# 删除空目录 否则报错
# os.rename("a","b") # 重命名文件或者目录
# print(os.stat("b")) #获取目录信息
# print(os.sep) # 输出路径分隔符 linux / windows //
# print(os.linesep) #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
# print(os.pathsep) #输出用于分割文件路径的字符串
# print(os.name) #输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
# os.system("ip ro") #必须在linux手动执行脚本
# print(os.environ) #获取环境变量
# print(os.path.abspath("b")) # # 获取b目录规范化的绝对路径
# print(os.path.split("b")) #将传入的字符串路径分割成目录和文件名二元数组返回 ('', 'b')
print(os.path.dirname("a/b")) #获取最后一个目录之前的路径
print(os.path.exists('/b/c')) #判断是否存在 返回True 或者false
print(os.path.basename('a/b/c')) #获取最后一层目录
print(os.path.isabs('a/b/c')) #是否是绝对路径
print(os.path.isfile('b/sss')) #最后一个名是否是文件 返回True 或者false
print(os.path.isdir('a/b'))#最后一个名是否是目录 返回True 或者false
print(os.path.join("a/b/c","b/b")) #a/b/c\b/b
print(os.path.getatime("a/b/c"))
print(os.path.getmtime("a/b/c"))

案例:

根据用户输入创建目录

 import os,sys
dirname = input("input ur dir name:").strip()
dir_path = os.getcwd() #获取当前脚本所在目录
new_path = r"%s\%s"%(dir_path,dirname) #拼接输入名与目录路径
if not os.path.exists(new_path):
os.mkdir(new_path)

os 模块常用 功能 dirname basename join

这里先介绍 内置函数vars()

每个py文件相当于一个模块,而这个文件的许多方法,可以用print(var())

 print(vars())

 -----------------
C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py
{'__name__': '__main__', '__cached__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000226A98E5BE0>, '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, '__file__': 'E:/py/55/learn-python/oldboy/6/module_test2.py', '__package__': None}

__doc__ #py文件开头的注释文字

__file__ #当前py文件的路径

__package__ #包含文件所在包,用 . 分隔,当前文件为None,导入的其他文件:指定文件所在包,用.分隔。

__cached__ #文件的缓存

      #当前文件没有,导入的其他文件有缓存

__name__ #如果是主文件,__name__==__main__,否则,等于模块名。用作执行的条件判断。

1、主文件

调用主函数前 ,必须加判断。if __name__==__main__:

2、__file__

当前文件的路径,

返回当前文件的目录

 print(__doc__) # python文件的注释 三引号 注释必须在开头,

 print(__file__) #自身脚本文件加路径
print(__package__) # 当前文件为None
from s12_mokuai import s1
print(s1.__package__) # 导入模块文件的文件: 则输出导入模块文件的所在目录 #
# from s12_mokuai import s1
# print(s1.__cached__) #导入的文件,则输出其缓存目录
 print(__cached__)    #没有导入 当前文件的缓存为None,

文件路径及目录,获取文件名等等操作

 import os
print(__file__)#文件的路径
print(os.path.dirname(__file__))#返回文件的目录,文件的上层
print(os.path.dirname(os.path.dirname(__file__)))#上层的上层
print(os.path.basename(__file__))#返回文件名 -------------------------- C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py
E:/py/55/learn-python/oldboy/6/module_test2.py
E:/py/55/learn-python/oldboy/6
E:/py/55/learn-python/oldboy
module_test2.py

重点1 而 __name__的重要性不言而喻

当我们的程序只有一个入口的时候,如果加入if __name__ == "__main__": 那么我们程序主文件被导入的时候__name__的值是模块的名字,程序主程序是不执行的。

 print(__name__) # 当执行该脚本时候输出为 __main__ 而当被导入的时候是其模块名称
# 主文件
# 调用主函数前,必须 if __name__ == "__main__":

重点2 __file__  #自身脚本文件加路径

假如当前脚本所在目录还有一个目录,python里面称为包,而这个包下有好多模块,也就是py文件,我们如果想调用,怎么用呢??这就用到os模块的 三个方法basename dirname join 还有我们刚提到的__file__  还有 sys的path方法

 import os,sys
print(os.path.dirname(__file__))
p1 = os.path.dirname(__file__)#返回文件的目录,文件的上层
p2 = os.path.basename(__file__)#返回文件的文件名
new_dir = os.path.join(p1,p2)#拼接成路径
sys.path.append(new_dir)#加入到sys.path

2、sys

用于提供对解释器相关的操作

 sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

2.1 argv 将文件名和参数做成列表返回

 import sys
print(sys.argv) saltstack_s:/share/py_test/s8 # py s9_argv.py 9 9 9 9
['s9_argv.py', '', '', '', '']

sys.stdout.write()

sys.stdout.flush()刷新屏幕缓存io

 #进度条案例
import time,sys
for i in range(101):
#显示进度条百分比 #号从1开始 空格从99递减
hashes = '#' * int(i / 100.0 * 100)
spaces = ' ' * (100 - len(hashes))
sys.stdout.write("\r[%s] %s%%" % (hashes + spaces, i)) #必须两个%%才是,因为一个%是取模,python解释器会默认过滤
sys.stdout.flush() #强制刷新屏幕缓冲区使其一行输出
time.sleep(0.05)
 import time
import sys
for i in range(30):
sys.stdout.write('\r')
sys.stdout.write("%s%%|%s" % (int(i/30*100),int(i/30*100)*"*"))
sys.stdout.flush()
time.sleep(0.3)

3 time datatime模块

时间相关的操作,时间有三种表示方式:

  • 时间戳               1970年1月1日之后的秒,即:time.time()
  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
  • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
 print time.time()  # 时间戳  1970年1月1日开始计时   unix系统诞生 1463840728.7381186
print time.mktime(time.localtime()) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0 print time.gmtime() #可加时间戳参数 # 结构化UTC时间返回 元组返回 年、日、星期 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=7, tm_min=26, tm_sec=11, tm_wday=1, tm_yday=138, tm_isdst=0)
print time.localtime() #可加时间戳参数 #结构化计算机本地时间返回 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15, tm_min=31, tm_sec=26, tm_wday=1, tm_yday=138, tm_isdst=0)
print time.strptime('2014-11-11', '%Y-%m-%d') print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25 print time.strftime('%Y-%m-%d') #默认当前时间
print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
print time.asctime()
print time.asctime(time.localtime())
print time.ctime(time.time()) import datetime
'''
datetime.date:表示日期的类。常用的属性有year, month, day
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
datetime.datetime:表示日期时间
datetime.timedelta:表示时间间隔,即两个时间点之间的长度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
print datetime.datetime.now()
print datetime.datetime.now() - datetime.timedelta(days=5)

3.1 time 模块练习

时间戳与日期之间的相互转化

 当前时间戳:time.time()
当前日期:time.ctime()
1、Python下日期到时间戳的转换
import datetime
import time
dateC=datetime.datetime(2010,6,6,8,14,59)
timestamp=time.mktime(dateC.timetuple())
print timestamp 2、Python下将时间戳转换到日期
import datetime
import time
ltime=time.localtime(1395025933)
timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime)
 #!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import time
"""
时间相关的操作,时间有三种表示方式: 时间戳 1970年1月1日之后的秒,即:time.time()
格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
结构化时间 元组包含了:等... time.struct_time 即:time.localtime()
"""
 ##################   时间戳 与  结构化时间 转换    ######################
print(time.time()) # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186
print(time.ctime()) # 周 月 日 时间 年 Sat May 21 22:25:28 2016
print(time.ctime(time.time())) # 转换时间戳 为 Sat May 21 22:25:28 2016
print(time.ctime(time.time() - 86400)) # 转换时间戳 为 Sat May 21 22:25:28 2016 print(time.gmtime()) # 结构化UTC时间返回 元组返回 年、日、星期 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=7, tm_min=26, tm_sec=11, tm_wday=1, tm_yday=138, tm_isdst=0)
obj = time.gmtime()
print(obj.tm_year) #获取结构化的时间年 2016
print(time.localtime()) #结构化计算机本地时间返回 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15, tm_min=31, tm_sec=26, tm_wday=1, tm_yday=138, tm_isdst=0)
#结构化时间 转换 时间戳 print(time.mktime(time.localtime())) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0
################## ################## ################## ################## ################## 结构化时间 与 字符串时间转换 ######################
#将结构化的对象时间转换为字符串 trftime 即:time.struct_time(tm_year=2016, tm_mon=5,。。。) ===转换为=》 ”%Y-%m-%d %H:%M %s# “
print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25
#将字符串日期 转换为 时间结构对象 strptime ”%Y-%m-%d %H:%M %s# “ ===转换为=》 time.struct_time(tm_year=2016, tm_mon=5,。。。)
print(time.strptime("2016-09-10 10:11","%Y-%m-%d %H:%M")) # time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15,
################## ################## ################## ##################

3.2 datetime 模块练习

 import datetime
'''
datetime.date:表示日期的类。常用的属性有year, month, day
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
datetime.datetime:表示日期时间
datetime.timedelta:表示时间间隔,即两个时间点之间的长度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
print datetime.datetime.now()
print datetime.datetime.now() - datetime.timedelta(days=5)
 # -*- coding: utf-8 -*-

  #datetime类
#datetime是date与time的结合体,包括date与time的所有信息。
#它的构造函数如下:
#datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
#各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。 # 1. datetime类定义的类属性与方法:
#datetime.min、datetime.max:datetime所能表示的最小值与最大值;
#print: datetime.max: 9999-12-31 23:59:59.999999
#print: datetime.min: 0001-01-01 00:00:00
from datetime import *
import time
print 'datetime.max:' , datetime.max
print 'datetime.min:' , datetime.min
#datetime.resolution:datetime最小单位;
#print: datetime.resolution: 0:00:00.000001
print 'datetime.resolution:' , datetime.resolution
#datetime.today():返回一个表示当前本地时间的datetime对象;
#print: today(): 2012-09-12 19:37:50.721000
print 'today():' , datetime.today()
#datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
#print: now(): 2012-09-12 19:37:50.738000
print 'now():' , datetime.now()
#datetime.utcnow():返回一个当前utc时间的datetime对象;
#print: 2012-09-12 11:37:50.739000
print 'utcnow():' , datetime.utcnow()
#datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
#print: fromtimestamp(tmstmp): 2012-09-12 19:37:50.741000
print 'fromtimestamp(tmstmp):' , datetime.fromtimestamp(time.time())
#datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
#print: utcfromtimestamp(tmstmp): 2012-09-12 11:37:50.742000
print 'utcfromtimestamp(tmstmp):' , datetime.utcfromtimestamp(time.time())
#datetime.combine(date, time):根据date和time,创建一个datetime对象;
#print: datetime.combine(date,time): 2012-09-12 19:46:05
d = date(2012,9,12)
from datetime import *
t = time(19,46,5)
print 'datetime.combine(date,time): ',datetime.combine(d,t)
#datetime.strptime(date_string, format):将格式字符串转换为datetime对象;
#print: 2007-03-04 21:08:12
print datetime.strptime("2007-03-04 21:08:12", "%Y-%m-%d %H:%M:%S") #2. datetime类提供的实例方法与属性
dt = datetime.strptime("2012-09-12 21:08:12", "%Y-%m-%d %H:%M:%S")
#print: 2012 9 12 21 8 12 0 None
print dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo
print dt.date()
print dt.time()
print dt.replace(year = 2013)
print dt.timetuple()
print dt.utctimetuple()
print dt.toordinal()
print dt.weekday()
print dt.isocalendar()
#print dt.isoformat([sep])
#datetime. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple())); #3. 格式字符串
# datetime. strftime (format)
# %a 星期的简写。如 星期三为Web
# %A 星期的全写。如 星期三为Wednesday
# %b 月份的简写。如4月份为Apr
# %B月份的全写。如4月份为April
# %c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
# %d: 日在这个月中的天数(是这个月的第几天)
# %f: 微秒(范围[0,999999])
# %H: 小时(24小时制,[0, 23])
# %I: 小时(12小时制,[0, 11])
# %j: 日在年中的天数 [001,366](是当年的第几天)
# %m: 月份([01,12])
# %M: 分钟([00,59])
# %p: AM或者PM
# %S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
# %U: 周在当年的周数当年的第几周),星期天作为周的第一天
# %w: 今天在这周的天数,范围为[0, 6],6表示星期天
# %W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
# %x: 日期字符串(如:04/07/10)
# %X: 时间字符串(如:10:43:39)
# %y: 2个数字表示的年份
# %Y: 4个数字表示的年份
# %z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
# %Z: 时区名称(如果是本地时间,返回空字符串)
# %%: %% => % dt = datetime.now()
#print: (%Y-%m-%d %H:%M:%S %f): 2012-09-12 23:04:27 145000
print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f')
#print: (%Y-%m-%d %H:%M:%S %p): 12-09-12 11:04:27 PM
print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p')
#print: %a: Wed
print '%%a: %s ' % dt.strftime('%a')
#print: %A: Wednesday
print '%%A: %s ' % dt.strftime('%A')
#print: %b: Sep
print '%%b: %s ' % dt.strftime('%b')
#print: %B: September
print '%%B: %s ' % dt.strftime('%B')
#print: 日期时间%c: 09/12/12 23:04:27
print '日期时间%%c: %s ' % dt.strftime('%c')
#print: 日期%x:09/12/12
print '日期%%x:%s ' % dt.strftime('%x')
#print: 时间%X:23:04:27
print '时间%%X:%s ' % dt.strftime('%X')
#print: 今天是这周的第3天
print '今天是这周的第%s天 ' % dt.strftime('%w')
#print: 今天是今年的第256天
print '今天是今年的第%s天 ' % dt.strftime('%j')
#print: 今周是今年的第37周
print '今周是今年的第%s周 ' % dt.strftime('%U')

4 hashlib

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

 import hashlib

 # ######## md5 ########

 hash = hashlib.md5()
hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest()) # ######## sha1 ######## hash = hashlib.sha1()
hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256()
hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384()
hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512()
hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest())

加盐

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

 ######## md5 加盐########

 hash = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8"))

 hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest())
 obj = hashlib.md5(bytes("salt;%#%salt", encoding="utf-8"))  # 这里是输入的盐值  ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
print(obj) # <md5 HASH object @ 0x0000000000A1F800>
obj.update(bytes("mypasswd123", encoding="utf-8")) # 更新哈希对象以字符串参数 其实就是你的明文密码
print(obj.digest()) ##返回摘要,作为二进制数据字符串值 b'\x04\x80)\x17\\\xf8dPA\xbc\xd9@e\xeb&\x0f'
print(obj.hexdigest()) # 返回十六进制数字字符串 048029175cf8645041bcd94065eb260f

HMAC加密:

python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密 

消息认证算法:MAC (Message Authentication Codes)  消息认证码

 import hmac
h = hmac.new('wupeiqi')
h.update('hellowo')
print h.hexdigest()
  对称加密:
加密算法 + 口令
明文 --> 密文 字典攻击 20位:100^20=10^32 加密方,解密方使用同一个口令 加密算法:
DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des
AES:128位 高级加密标准
3DES:3次加密后的 加密方,解密方使用同一个口令
DES(56bits), 3DES, AES(128bits), Blowfish
Twofish, IDEA, RC6, CAST5, Serpent block 特性:1、加密/解密使用同一口令
2、将原文分割成固定大小的数据块,对这些进行加密
ECB, CBC
密钥交换(IKE: Internet Key Exchange):DH算法 发明者两个人的名字首字母 非对称加密: :本地生成一对钥匙,公钥私钥,公钥是可以公开的,私钥是自己的。跟别人通信,就把对方的公钥要过来,加密完,只有对方才能解开。
由于加密太长,所以不用来加密数据。用对称密码加密数据,用非对称密码的钥匙加密身份 加密算法:RSA, EIGamal, DSA 1、密钥交换
2、身份认证
单向加密:
抽取数据特征码:
MD5, SHA1, SHA512, CRC-32(循环冗余校验码) 1、完整性 消息认证算法:MAC (Message Authentication Codes) 消息认证码
CBC-MAC
HMAC: 雪崩效应:
定长输入: 数据加密: 抽取数据特征码用单向加密,再用非对称加密特征码,加在数据前面,然后在用对称加密,然后再用对方的公钥加密数据。发送出去。

加密介绍

注册 登陆案例

 import hashlib

 def md5(args):
hs=hashlib.md5()
hs.update(bytes(args,encoding="utf-8"))
return hs.hexdigest() def register(us,pw):
with open("db","a",encoding="utf-8") as f:
temp=us+"|"+md5(pw)+"\n"
f.write(temp)
def login(us,pw):
with open("db","r",encoding="utf-8") as f:
for i in f:
u,p=i.strip().split("|")
if u==us and md5(pw)==p:
return True
ch=int(input("1.登陆\n2.注册"))
if ch==2:
user=input("用户名:")
pwd=input("密码:")
register(user,pwd)
if ch==1:
user = input("用户名:")
pwd = input("密码:")
r=login(user,pwd)
if r:
print("登陆成功")
else:
print("登陆失败")

5 pickle 序列化 (等同json)

Python中用于序列化的两个模块

    •   json     用于【字符串】和 【python基本数据类型】 间进行转换
    •   pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换

  

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

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

  

load loads dumps dump 区别

  我们看一下 pickle 接口。 pickle 模块提供了以下函数对: dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象; loads(string) 返回包含在 pickle 字符串中的对象; dump(object, file) 将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数; load(file) 返回包含在 pickle 文件中的对象。

dumps dump 区别 存入文件

accounts = {
1000: {
'name': 'Alex LI',
'email': 'lijie3721@126.com',
'passwd': 'abc123',
'balance': 15000,
'phone': 13651054608,
'bank_acc': {
'ICBC': 14324234,
'CBC': 235234,
'ABC': 35235423
}
},
1001: {
'name': 'CaiXin Guo',
'email': 'caixin@126.com',
'passwd': 'abc145323',
'balance': -15000,
'phone': 1345635345,
'bank_acc': {
'ICBC': 4334343,
}
},
} import pickle # dumps 直接传存储对象,也就是先转成制服穿在传进文件
# f = open("pickle_test.db", "wb")
# f.write(pickle.dumps(accounts))
# f.close()
#dump除了传存储对象还有打开的文件句柄,同事完成
f = open("pickle_test2.db", "wb")
pickle.dump(accounts, f)
f.close()

load loads 区别 这里注意文件指针 一次read 就到结尾

import pickle

# f = open("pickle_test.db", "rb")
#
# acc = pickle.loads(f.read())
# f.close()
# print(acc,type(acc))
f = open("pickle_test2.db", "rb")
acc_load = pickle.load(f)
print(acc_load)

加载到内存修改后再存入文件

import pickle
f = open("account.db","rb") acc = pickle.loads(f.read())
f.close() acc[1000]['balance'] -=500 f = open("account.db","wb")
f.write(pickle.dumps(acc))
f.close() f = open("account.db","rb") acc = pickle.loads(f.read())
print(acc)
f.close()

6 json 序列化

  首先我们应该知道,python的一些不是通用的数据类型json是不能序列话的,比如时间戳等

 

 loads 方法 将传过来的字符串(长得像python的字典或者列表数据类型)序列化成字典或列表

  注意其调用的对象内部必须是双引号,json不识别单引号,而且,整个字符串必须被单引号或者三个引号引起来,否则报错

 import json

 # s = "{'data':'invilad','status':'1000'}"  # json 认为里面必须是双引号才会处理,否则会报错,这样会报错
s1='{"data":"invilad","status":"1000"}' # json 认为里面必须是双引号才会处理,否则会报错,不会报错
s2="""{"data":"invilad","status":"1000"}""" # json 认为里面必须是双引号才会处理,否则会报错,不会报错
l = "[1,2,3]"
# ret = json.loads(s) # loads 将形似python数据类型列表或字典的字符串转换成 列表或者字典
ret2=json.loads(s1)
ret3=json.loads(s2)
# print(ret, type(ret))
print(ret2,type(ret2))
print(ret3,type(ret3))

dumps 方法  将python数据类型列表或字典转换成形似列表或者字典的字符串

 n = {'status': '', 'data': 'invilad'}
m = [1, 2, 3]
ret1 = json.dumps(n) # dumps 将python数据类型列表或字典转换成形似列表或者字典的字符串
print(ret1,type(ret1)) # {"data": "invilad", "status": "1000"} <class 'str'>
ret1 = json.dumps(m)
print(ret1,type(ret1)) # [1, 2, 3] <class 'str'>

dump 和load 的用法

 n = {'status': '', 'data': 'invilad'}
m = [1, 2, 3]
# json.dump(n,open("json_test",'w'))# dump 功能就是 先转换为字符串,再写入文件
r = json.load(open("json_test",'r'))# load 功能就是 读取文件字符串 并转化为python数据类型
print(r,type(r))

知识点2 :我们接收的网页请求过来是字符串或者字节

 from urllib import request

 f = request.urlopen("http://www.cnblogs.com/") #获取网站内容,作为对象
# f = request.urlopen("http://yujuanfudan.blog.163.com/")
ret = f.read() #对象的read方法读出来,和文件类似
print(type(ret)) #初始是bytes类型
print(str(ret, encoding="utf-8")) #转成字符串类型

7 requests 第三方模块  

Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

发送GET请求

 import urllib.request

 f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = f.read().decode('utf-8')
print(result)

发送携带请求头的GET请求

 import urllib.request

 req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
r = urllib.request.urlopen(req) result = f.read().decode('utf-8')

注:更多见Python官方文档:https://docs.python.org/3.5/library/urllib.request.html#module-urllib.request

request模块

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

1、安装模块

pip3 install requests

2、使用模块

 import requests,json
res=requests.get("http://www.weather.com.cn/adat/sk/101010500.html")
res.encoding="utf-8"
result=res.text #通过text拿到一个字符串
print(result,type(result))
dic=json.loads(result) #通过json.loads转化成字典
print(dic,type(dic))
 # 1、无参数实例

 import requests

 ret = requests.get('https://github.com/timeline.json')

 print(ret.url)
print(ret.text) # 2、有参数实例 import requests payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url)
print(ret.text) GET请求

GET请求

 # 1、基本POST实例

 import requests

 payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) # 2、发送请求头和数据实例 import requests
import json url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text)
print(ret.cookies) POST请求

POST请求

 requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs) 其他请求

其他请求

更多requests模块相关的文档见:http://cn.python-requests.org/zh_CN/latest/

3、Http请求和XML实例

实例:检测QQ账号是否在线

 import urllib
import requests
from xml.etree import ElementTree as ET # 使用内置模块urllib发送HTTP请求,或者XML格式内容
"""
f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = f.read().decode('utf-8')
""" # 使用第三方模块requests发送HTTP请求,或者XML格式内容
r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = r.text # 解析XML格式内容
node = ET.XML(result) # 获取内容
if node.text == "Y":
print("在线")
else:
print("离线")

实例:查看火车停靠信息

 import urllib
import requests
from xml.etree import ElementTree as ET # 使用内置模块urllib发送HTTP请求,或者XML格式内容
"""
f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
result = f.read().decode('utf-8')
""" # 使用第三方模块requests发送HTTP请求,或者XML格式内容
r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
result = r.text # 解析XML格式内容
root = ET.XML(result)
for node in root.iter('TrainDetailInfo'):
print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)

注:更多接口猛击这里

8 xml模块 

安装requests 模块

查看天气状况

 import requests,json
res=requests.get("http://www.weather.com.cn/adat/sk/101010500.html")
res.encoding="utf-8"
result=res.text #通过text拿到一个字符串
print(result,type(result))
dic=json.loads(result) #通过json.loads转化成字典
print(dic,type(dic))

xml 讲解:

XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:

first.xml

 <data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2026</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
 # 第一种,这种修改不了xml文件的内容
# 循环获取多级节点 标签
import requests
from xml.etree import ElementTree as ET
# f = open("first.xml","r",encoding="utf-8")
# ret = ET.XML(f.read())
#
# for node in ret:
# print(node.find("rank").text) # find的查找值一定要是 有text的内容的标签
#
# # for node_node in node:
# for node__ in node_node:
# print(node__.find("rank"))
# for node in ret.iter("country"):
# print(node.find("year").text) 课上代码

1、解析XML

利用ElementTree.XML将字符串解析成xml对象

 from xml.etree import ElementTree as ET

 # 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml) 利用ElementTree.XML将字符串解析成xml对象

#利用ElementTree.parse将文件直接解析成xml对象

 from xml.etree import ElementTree as ET

 # 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() #利用ElementTree.parse将文件直接解析成xml对象

xml解析和保存的方式

 # 解析xml
# 1 接口url 请求get获得的字符串类型 XML
# import requests
# from xml.etree import ElementTree as ET
# r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=")
# result = r.text
# # 将 请求的字符串结果 通过xml的模块的方法转换成xml格式
# ret = ET.XML(result)
# ==============分隔符====如下是文件句柄 读取的字符串
# from xml.etree import ElementTree as ET
# f = open("first.xml","r",encoding="utf-8")
# ret = ET.XML(f.read())
#
# 对于 上面的这种 是Element对象,而不是ElementTree对象,因此不能够write到文件,但是
#我们可以 先创建ElementTree对象
# tree = ElementTree(ret) #将ret这个Element对象对应的内存的xml字符串 传给ElementTree类 做成ElementTree对象
# tree.write("new.xml")
# 2 文件类型的xml文档 parse
#from xml.etree import ElementTree as ET
# n = ET.parse("first.xml")
#
# ret = n.getroot() # getroot方法拿到根节点 # son = ET.Element("Biaoqian2",{"key":"value"})
# son.text="zhi"
# ele1 = ET.Element("qq",key2="value2", )
# ele1.text="woshizhi"
# ret.append(son)
# son.append(ele1)
# n.write("out2.xml") xml解析和保存的方式

2、操作XML

XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:

 class Element:
"""An XML element. This class is the reference implementation of the Element interface. An element's length is its number of subelements. That means if you
want to check if an element is truly empty, you should check BOTH
its length AND its text attribute. The element tag, attribute names, and attribute values can be either
bytes or strings. *tag* is the element name. *attrib* is an optional dictionary containing
element attributes. *extra* are additional element attributes given as
keyword arguments. Example form:
<tag attrib>text<child/>...</tag>tail """ 当前节点的标签名
tag = None
"""The element's name.""" 当前节点的属性 attrib = None
"""Dictionary of the element's attributes.""" 当前节点的内容
text = None
"""
Text before first subelement. This is either a string or the value None.
Note that if there is no text, this attribute may be either
None or the empty string, depending on the parser. """ tail = None
"""
Text after this element's end tag, but before the next sibling element's
start tag. This is either a string or the value None. Note that if there
was no text, this attribute may be either None or an empty string,
depending on the parser. """ def __init__(self, tag, attrib={}, **extra):
if not isinstance(attrib, dict):
raise TypeError("attrib must be dict, not %s" % (
attrib.__class__.__name__,))
attrib = attrib.copy()
attrib.update(extra)
self.tag = tag
self.attrib = attrib
self._children = [] def __repr__(self):
return "<%s %r at %#x>" % (self.__class__.__name__, self.tag, id(self)) def makeelement(self, tag, attrib):
创建一个新节点
"""Create a new element with the same type. *tag* is a string containing the element name.
*attrib* is a dictionary containing the element attributes. Do not call this method, use the SubElement factory function instead. """
return self.__class__(tag, attrib) def copy(self):
"""Return copy of current element. This creates a shallow copy. Subelements will be shared with the
original tree. """
elem = self.makeelement(self.tag, self.attrib)
elem.text = self.text
elem.tail = self.tail
elem[:] = self
return elem def __len__(self):
return len(self._children) def __bool__(self):
warnings.warn(
"The behavior of this method will change in future versions. "
"Use specific 'len(elem)' or 'elem is not None' test instead.",
FutureWarning, stacklevel=2
)
return len(self._children) != 0 # emulate old behaviour, for now def __getitem__(self, index):
return self._children[index] def __setitem__(self, index, element):
# if isinstance(index, slice):
# for elt in element:
# assert iselement(elt)
# else:
# assert iselement(element)
self._children[index] = element def __delitem__(self, index):
del self._children[index] def append(self, subelement):
为当前节点追加一个子节点
"""Add *subelement* to the end of this element. The new element will appear in document order after the last existing
subelement (or directly after the text, if it's the first subelement),
but before the end tag for this element. """
self._assert_is_element(subelement)
self._children.append(subelement) def extend(self, elements):
为当前节点扩展 n 个子节点
"""Append subelements from a sequence. *elements* is a sequence with zero or more elements. """
for element in elements:
self._assert_is_element(element)
self._children.extend(elements) def insert(self, index, subelement):
在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置
"""Insert *subelement* at position *index*."""
self._assert_is_element(subelement)
self._children.insert(index, subelement) def _assert_is_element(self, e):
# Need to refer to the actual Python implementation, not the
# shadowing C implementation.
if not isinstance(e, _Element_Py):
raise TypeError('expected an Element, not %s' % type(e).__name__) def remove(self, subelement):
在当前节点在子节点中删除某个节点
"""Remove matching subelement. Unlike the find methods, this method compares elements based on
identity, NOT ON tag value or contents. To remove subelements by
other means, the easiest way is to use a list comprehension to
select what elements to keep, and then use slice assignment to update
the parent element. ValueError is raised if a matching element could not be found. """
# assert iselement(element)
self._children.remove(subelement) def getchildren(self):
获取所有的子节点(废弃)
"""(Deprecated) Return all subelements. Elements are returned in document order. """
warnings.warn(
"This method will be removed in future versions. "
"Use 'list(elem)' or iteration over elem instead.",
DeprecationWarning, stacklevel=2
)
return self._children def find(self, path, namespaces=None):
获取第一个寻找到的子节点
"""Find first matching element by tag name or path. *path* is a string having either an element tag or an XPath,
*namespaces* is an optional mapping from namespace prefix to full name. Return the first matching element, or None if no element was found. """
return ElementPath.find(self, path, namespaces) def findtext(self, path, default=None, namespaces=None):
获取第一个寻找到的子节点的内容
"""Find text for first matching element by tag name or path. *path* is a string having either an element tag or an XPath,
*default* is the value to return if the element was not found,
*namespaces* is an optional mapping from namespace prefix to full name. Return text content of first matching element, or default value if
none was found. Note that if an element is found having no text
content, the empty string is returned. """
return ElementPath.findtext(self, path, default, namespaces) def findall(self, path, namespaces=None):
获取所有的子节点
"""Find all matching subelements by tag name or path. *path* is a string having either an element tag or an XPath,
*namespaces* is an optional mapping from namespace prefix to full name. Returns list containing all matching elements in document order. """
return ElementPath.findall(self, path, namespaces) def iterfind(self, path, namespaces=None):
获取所有指定的节点,并创建一个迭代器(可以被for循环)
"""Find all matching subelements by tag name or path. *path* is a string having either an element tag or an XPath,
*namespaces* is an optional mapping from namespace prefix to full name. Return an iterable yielding all matching elements in document order. """
return ElementPath.iterfind(self, path, namespaces) def clear(self):
清空节点
"""Reset element. This function removes all subelements, clears all attributes, and sets
the text and tail attributes to None. """
self.attrib.clear()
self._children = []
self.text = self.tail = None def get(self, key, default=None):
获取当前节点的属性值
"""Get element attribute. Equivalent to attrib.get, but some implementations may handle this a
bit more efficiently. *key* is what attribute to look for, and
*default* is what to return if the attribute was not found. Returns a string containing the attribute value, or the default if
attribute was not found. """
return self.attrib.get(key, default) def set(self, key, value):
为当前节点设置属性值
"""Set element attribute. Equivalent to attrib[key] = value, but some implementations may handle
this a bit more efficiently. *key* is what attribute to set, and
*value* is the attribute value to set it to. """
self.attrib[key] = value def keys(self):
获取当前节点的所有属性的 key """Get list of attribute names. Names are returned in an arbitrary order, just like an ordinary
Python dict. Equivalent to attrib.keys() """
return self.attrib.keys() def items(self):
获取当前节点的所有属性值,每个属性都是一个键值对
"""Get element attributes as a sequence. The attributes are returned in arbitrary order. Equivalent to
attrib.items(). Return a list of (name, value) tuples. """
return self.attrib.items() def iter(self, tag=None):
在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。
"""Create tree iterator. The iterator loops over the element and all subelements in document
order, returning all elements with a matching tag. If the tree structure is modified during iteration, new or removed
elements may or may not be included. To get a stable set, use the
list() function on the iterator, and loop over the resulting list. *tag* is what tags to look for (default is to return all elements) Return an iterator containing all the matching elements. """
if tag == "*":
tag = None
if tag is None or self.tag == tag:
yield self
for e in self._children:
yield from e.iter(tag) # compatibility
def getiterator(self, tag=None):
# Change for a DeprecationWarning in 1.4
warnings.warn(
"This method will be removed in future versions. "
"Use 'elem.iter()' or 'list(elem.iter())' instead.",
PendingDeprecationWarning, stacklevel=2
)
return list(self.iter(tag)) def itertext(self):
在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。
"""Create text iterator. The iterator loops over the element and all subelements in document
order, returning all inner text. """
tag = self.tag
if not isinstance(tag, str) and tag is not None:
return
if self.text:
yield self.text
for e in self:
yield from e.itertext()
if e.tail:
yield e.tail 节点功能一览表

由于 每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),so   可以利用以上方法进行操作xml文件。

解析文件方法

  1 先open文件获得文件句柄 ,然后通过ElementTree.XML方法

  2 ElementTree.parse(file_name)

a. 遍历XML文档的所有内容

 from xml.etree import ElementTree as ET

 ############ 解析方式一 ############
"""
# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
"""
############ 解析方式二 ############ # 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ### 操作 # 顶层标签
print(root.tag) # 遍历XML文档的第二层
for child in root:
# 第二层节点的标签名称和标签属性
print(child.tag, child.attrib)
# 遍历XML文档的第三层
for i in child:
# 第二层节点的标签名称和内容
print(i.tag,i.text)

b、遍历XML中指定的节点

 from xml.etree import ElementTree as ET

 ############ 解析方式一 ############
"""
# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
"""
############ 解析方式二 ############ # 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ### 操作 # 顶层标签
print(root.tag) # 遍历XML中所有的year节点
for node in root.iter('year'):
# 节点的标签名称和内容
print(node.tag, node.text)

c、修改节点内容

由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。

1  解析字符串方式,修改,保存

以open文件句柄方式打开文件并解析的文件,要最后生成ElementTree对象才能write

 from xml.etree import ElementTree as ET

 ############ 解析方式一 ############

 # 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签
print(root.tag) # 循环所有的year节点
for node in root.iter('year'):
# 将year节点中的内容自增一
new_year = int(node.text) + 1
node.text = str(new_year) # 设置属性
node.set('name', 'alex')
node.set('age', '')
# 删除属性
del node.attrib['name'] ############ 保存文件 ############
因为root是ElementTree.Element对象,没有write方法,只有ElementTree有write方法,可以将root对应的内存地址内容传给ElementTree,实例化成ElementTree对象,就有write方法了 tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8') #如果更改内容有中文就需要指定编码了

2  解析文件方式,修改,保存

而以parse打开的文件,就是ElementTree对象,就有write方法

 from xml.etree import ElementTree as ET

 ############ 解析方式二 ############

 # 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ############ 操作 ############ # 顶层标签
print(root.tag) # 循环所有的year节点
for node in root.iter('year'):
# 将year节点中的内容自增一
new_year = int(node.text) + 1
node.text = str(new_year) # 设置属性
node.set('name', 'alex')
node.set('age', '')
# 删除属性
del node.attrib['name'] ############ 保存文件 ############
tree.write("newnew.xml", encoding='utf-8')

d、删除节点  

1 解析字符串方式打开,删除,保存

Element对象的remove方法 以 open方式打开如何保存

 from xml.etree import ElementTree as ET

 ############ 解析字符串方式打开 ############

 # 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签
print(root.tag) # 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text) if rank > 50:
# 删除指定country节点
root.remove(country) ############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8') Element对象的remove方法 以 open方式打开如何保存

2 解析文件方式打开,删除,保存

Element对象 remove 方法 以parse方法打开xml文件保存方法

 from xml.etree import ElementTree as ET

 ############ 解析文件方式 ############

 # 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ############ 操作 ############ # 顶层标签
print(root.tag) # 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text) if rank > 50:
# 删除指定country节点
root.remove(country) ############ 保存文件 ############
tree.write("newnew.xml", encoding='utf-8') Element对象 remove 方法 以parse方法打开xml文件保存方法

3、创建XML文档  

    类型str 等类 创建字符串有两种方式生成  a = 'name'  a = str("name")

创建方式(一)  类 Element(标签,{属性:值})

 from xml.etree import ElementTree as ET

 # 创建根节点
root = ET.Element("famliy") # 创建节点大儿子
son1 = ET.Element('son', {'name': '儿1'})
# 创建小儿子
son2 = ET.Element('son', {"name": '儿2'}) # 在大儿子中创建两个孙子
grandson1 = ET.Element('grandson', {'name': '儿11'})
grandson2 = ET.Element('grandson', {'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2) # 把儿子添加到根节点中
root.append(son1)
root.append(son1) tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) Element 创建xml方式

Element 创建xml方式

 #!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo' from xml.etree import ElementTree as ET
tree = ET.parse("first.xml") # 直接解析xml格式文件 root = tree.getroot() #利用getroot方法获取根节点
# print(root.tag)
# print(root.attrib)
# print(root.text) # 同 字符串创建的两种方式来看 xml也有两种方式创建
#2 利用 Element类直接创建 ======
son = ET.Element("Biaoqian2",{"key":"value"})
son.text="zhi"
ele1 = ET.Element("qq",key2="value2", )
ele1.text="woshizhi"
root.append(son)
son.append(ele1)
tree.write("out2.xml") 在已有文件获取根节点情况 利用Element创建 二级三级节点

在已有文件获取根节点情况 利用Element创建 二级三级节点

创建方式(二)

 from xml.etree import ElementTree as ET

 # 创建根节点
root = ET.Element("famliy") # 创建大儿子
# son1 = ET.Element('son', {'name': '儿1'})
son1 = root.makeelement('son', {'name': '儿1'})
# 创建小儿子
# son2 = ET.Element('son', {"name": '儿2'})
son2 = root.makeelement('son', {"name": '儿2'}) # 在大儿子中创建两个孙子
# grandson1 = ET.Element('grandson', {'name': '儿11'})
grandson1 = son1.makeelement('grandson', {'name': '儿11'})
# grandson2 = ET.Element('grandson', {'name': '儿12'})
grandson2 = son1.makeelement('grandson', {'name': '儿12'}) son1.append(grandson1)
son1.append(grandson2) # 把儿子添加到根节点中
root.append(son1)
root.append(son1) tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) 利用 makeelement创建 Element类的对象 创建一个新文件

利用 makeelement创建 Element类的对象 创建一个新文件

 from xml.etree import ElementTree as ET
tree = ET.parse("first.xml") # 直接解析xml格式文件 root = tree.getroot() #利用getroot方法获取根节点
print(root.tag)
print(root.attrib)
print(root.text) # 同 字符串创建的两种方式来看 xml也有两种方式创建
#
# 1 利用 makeelement创建 Element类的对象 =====
son = root.makeelement("biaoqian",{"key":"value"}) s = son.makeelement("biaoqian2",{"key2":"value"}) #Element类的对象 son.append(s) #传入根的儿子的儿子
root.append(son) # 传入根节点下,作为儿子 tree.write("out.xml") 已有文件first.xml 利用 makeelement创建 Element类的对象

已有文件first.xml 利用 makeelement创建 Element类的对象

创建方式(三)

 from xml.etree import ElementTree as ET

 # 创建根节点
root = ET.Element("famliy") # 创建节点大儿子
son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
# 创建小儿子
son2 = ET.SubElement(root, "son", attrib={"name": "儿2"}) # 在大儿子中创建一个孙子
grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
grandson1.text = '孙子' et = ET.ElementTree(root) #生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False) SubElement创建

SubElement创建

将生成的xml的标签加缩进后写入新文件

由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:

 from xml.etree import ElementTree as ET
from xml.dom import minidom def prettify(elem):
"""将节点转换成字符串,并添加缩进。
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t") # 创建根节点
root = ET.Element("famliy") # 创建大儿子
# son1 = ET.Element('son', {'name': '儿1'})
son1 = root.makeelement('son', {'name': '儿1'})
# 创建小儿子
# son2 = ET.Element('son', {"name": '儿2'})
son2 = root.makeelement('son', {"name": '儿2'}) # 在大儿子中创建两个孙子
# grandson1 = ET.Element('grandson', {'name': '儿11'})
grandson1 = son1.makeelement('grandson', {'name': '儿11'})
# grandson2 = ET.Element('grandson', {'name': '儿12'})
grandson2 = son1.makeelement('grandson', {'name': '儿12'}) son1.append(grandson1)
son1.append(grandson2) # 把儿子添加到根节点中
root.append(son1)
root.append(son1) raw_str = prettify(root) f = open("xxxoo.xml",'w',encoding='utf-8')
f.write(raw_str)
f.close() Element 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件

Element 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件

函数封装了 缩进和写入文件的功能

 from xml.etree import ElementTree as ET
from xml.dom import minidom def MyWrite(root, file_path): rough_string = ET.tostring(root, 'utf-8')
reparsed = minidom.parseString(rough_string)
new_str = reparsed.toprettyxml(indent="\t")
f = open(file_path, 'w', encoding='utf-8')
f.write(new_str)
f.close() root = ET.Element('family', {"age": ""}) # son = ET.Element('family', {"age": "18"})
# son = root.makeelement('family', {"age": "18"})
# root.append(son)
ET.SubElement(root,'family', {"age": ""})
son = ET.SubElement(root,'family', {"age": "十一"})
ET.SubElement(son,'family', {"age": ""}) # tree = ET.ElementTree(root)
# tree.write("out.xml", encoding='utf-8', short_empty_elements=False)
# tree.write("out.xml", encoding='utf-8', xml_declaration=True)
# ET.tostring() MyWrite(root, "nnnnn.xml") 传入 xml对象 和文件

传入 xml对象 和文件

4、命名空间

详细介绍,猛击这里

 from xml.etree import ElementTree as ET

 ET.register_namespace('com',"http://www.company.com") #some name

 # build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": ""})
body.text = "STUFF EVERYWHERE!" # wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root) tree.write("page.xml",
xml_declaration=True,
encoding='utf-8',
method="xml") 命名空间

练习

1 xml 获取qq是否在线 

 http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=627904863
 import requests
from xml.etree import ElementTree as ET #XML 模块
req = requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=1003408567")
res = req.text #获取get到的字符串,用.text方法 #解析xml格式内容
#xml接受一个参数:字符串,格式化为特殊的对象
node = ET.XML(res)
if node.text == "Y":
print("在线")
elif node.text == "N":
print("离线")
elif node.text == "V":
print("隐身")

2 获取列车时刻表 xml 

 <DataSet xmlns="http://WebXml.com.cn/">
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="getDetailInfo">
<xs:element name="getDetailInfo" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="TrainDetailInfo">
<xs:complexType>
<xs:sequence>
<xs:element name="TrainStation" type="xs:string" minOccurs="0"/>
<xs:element name="ArriveTime" type="xs:string" minOccurs="0"/>
<xs:element name="StartTime" type="xs:string" minOccurs="0"/>
<xs:element name="KM" type="xs:short" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<getDetailInfo xmlns="">
<TrainDetailInfo diffgr:id="TrainDetailInfo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<TrainStation>上海(车次:K234\K235)</TrainStation>
<ArriveTime/>
<StartTime>11:12:00</StartTime>
<KM>0</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
<TrainStation>昆山</TrainStation>
<ArriveTime>11:45:00</ArriveTime>
<StartTime>11:48:00</StartTime>
<KM>49</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo3" msdata:rowOrder="2" diffgr:hasChanges="inserted">
<TrainStation>苏州</TrainStation>
<ArriveTime>12:12:00</ArriveTime>
<StartTime>12:16:00</StartTime>
<KM>84</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo4" msdata:rowOrder="3" diffgr:hasChanges="inserted">
<TrainStation>无锡</TrainStation>
<ArriveTime>12:44:00</ArriveTime>
<StartTime>12:55:00</StartTime>
<KM>126</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo5" msdata:rowOrder="4" diffgr:hasChanges="inserted">
<TrainStation>常州</TrainStation>
<ArriveTime>13:22:00</ArriveTime>
<StartTime>13:26:00</StartTime>
<KM>165</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo6" msdata:rowOrder="5" diffgr:hasChanges="inserted">
<TrainStation>镇江</TrainStation>
<ArriveTime>14:13:00</ArriveTime>
<StartTime>14:16:00</StartTime>
<KM>237</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo7" msdata:rowOrder="6" diffgr:hasChanges="inserted">
<TrainStation>南京</TrainStation>
<ArriveTime>15:04:00</ArriveTime>
<StartTime>15:16:00</StartTime>
<KM>301</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo8" msdata:rowOrder="7" diffgr:hasChanges="inserted">
<TrainStation>蚌埠</TrainStation>
<ArriveTime>17:27:00</ArriveTime>
<StartTime>17:50:00</StartTime>
<KM>485</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo9" msdata:rowOrder="8" diffgr:hasChanges="inserted">
<TrainStation>徐州</TrainStation>
<ArriveTime>19:38:00</ArriveTime>
<StartTime>19:58:00</StartTime>
<KM>649</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo10" msdata:rowOrder="9" diffgr:hasChanges="inserted">
<TrainStation>商丘</TrainStation>
<ArriveTime>22:12:00</ArriveTime>
<StartTime>22:17:00</StartTime>
<KM>795</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo11" msdata:rowOrder="10" diffgr:hasChanges="inserted">
<TrainStation>开封</TrainStation>
<ArriveTime>23:49:00</ArriveTime>
<StartTime>23:53:00</StartTime>
<KM>926</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo12" msdata:rowOrder="11" diffgr:hasChanges="inserted">
<TrainStation>郑州</TrainStation>
<ArriveTime>00:37:00</ArriveTime>
<StartTime>01:14:00</StartTime>
<KM>998</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo13" msdata:rowOrder="12" diffgr:hasChanges="inserted">
<TrainStation>新乡</TrainStation>
<ArriveTime>02:20:00</ArriveTime>
<StartTime>02:22:00</StartTime>
<KM>1078</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo14" msdata:rowOrder="13" diffgr:hasChanges="inserted">
<TrainStation>鹤壁</TrainStation>
<ArriveTime>03:01:00</ArriveTime>
<StartTime>03:03:00</StartTime>
<KM>1144</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo15" msdata:rowOrder="14" diffgr:hasChanges="inserted">
<TrainStation>安阳</TrainStation>
<ArriveTime>03:33:00</ArriveTime>
<StartTime>03:36:00</StartTime>
<KM>1185</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo16" msdata:rowOrder="15" diffgr:hasChanges="inserted">
<TrainStation>邯郸</TrainStation>
<ArriveTime>04:11:00</ArriveTime>
<StartTime>04:16:00</StartTime>
<KM>1245</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo17" msdata:rowOrder="16" diffgr:hasChanges="inserted">
<TrainStation>邢台</TrainStation>
<ArriveTime>04:47:00</ArriveTime>
<StartTime>04:51:00</StartTime>
<KM>1297</KM>
</TrainDetailInfo>
<TrainDetailInfo diffgr:id="TrainDetailInfo18" msdata:rowOrder="17" diffgr:hasChanges="inserted">
<TrainStation>石家庄</TrainStation>
<ArriveTime>06:05:00</ArriveTime>
<StartTime/>
<KM>1406</KM>
</TrainDetailInfo>
</getDetailInfo>
</diffgr:diffgram>
</DataSet> 列车时刻表

XML文件

 # 获取 列车时刻表
import requests
from xml.etree import ElementTree as ET
# 使用第三方模块requests 发送HTTP请求,或者XML 格式内容
r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=")
result = r.text # 将 请求的字符串结果 通过xml的模块的方法转换成xml格式
ret = ET.XML(result) for node in ret.iter("TrainDetailInfo"): # xml的iter是可迭代的 传参是 xml的标签的名
# print(node.tag,node.attrib) # tag是标签
# if not node.find("StartTime").text: # find 是查找标签内的文本的标签对应的内容
# node.find("StartTime").text = "都到站了,管它几点呢,晚点你也得坐啊"
print(node.find("TrainStation").text,node.find("StartTime").text) 完整查看xml列车时刻的代码
 import requests
from xml.etree import ElementTree as ET # 使用第三方模块requests发送HTTP请求,或者XML格式内容
url="http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode="
tr=input("请输入列车号:")
url=url+tr+"&UserID="
req = requests.get(url)
print(type(req))
res = req.text #获取get到的字符串 #解析XML格式内容,把字符串解析成xml。
root=ET.XML(res)
for node in root.iter("TrainDetailInfo"):
# print(node.tag,node.attrib)
print(node.find("TrainStation").text,node.find("StartTime").text)

python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml的更多相关文章

  1. Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml

    模块分为三种: 自定义模块 内置模块 开源模块 一.安装第三方模块 # python 安装第三方模块 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+py ...

  2. Python模块/包/库安装几种方法(转载)

    一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip或tar.gz),进行解压,CMD->cd进入模 ...

  3. Python基础(十)-模块

    模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...

  4. python基础学习十 logging模块详细使用【转载】

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...

  5. python基础(10)--模块

    模块(module) 模块,用一坨代码实现了某个功能的代码集合 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来 ...

  6. Python基础(12)--模块

    本文地址:http://www.cnblogs.com/archimedes/p/python-modules.html,转载请注明源地址. 模块简介 如果你退出 Python 解释器重新进入,以前创 ...

  7. python基础教程总结9——模块,包,标准库

    1. 模块 在python中一个文件可以被看成一个独立模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用. 1.1 模块搜索路径 导入模块时,是按照sys ...

  8. python基础:如何使用 pip 安装第三方库

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在这个生活中处处都是大数据和人工智能的时代,总是能在各种角落看到 Pyth ...

  9. 第六章:Python基础の反射与常用模块解密

    本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...

随机推荐

  1. The Battle of Chibi(数据结构优化dp,树状数组)

    The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...

  2. python类和self解析

    在介绍Python的self用法之前,先来介绍下Python中的类和实例……我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用 ...

  3. JVM Direct Memory

    JVM除了堆内存.栈内存,还有DirectMemory内存,DirectMemory是java nio引入的. 在JDK1.4中新加入了NIO(New INput/Output)类,引入了一种基于通道 ...

  4. gitpython 操作

    gitpython 获取仓库远程分支 https://blog.csdn.net/laiyaoditude/article/details/86218508 python操作git https://w ...

  5. 绑定class -vue

    1.值为对象 :class = "{ 'text-red': isActive }" data () { return { isActive : true } } :class = ...

  6. Introduction of Generator in Python

    Python中生成器的原理与使用详解 原创牛大财有大才 发布于2018-09-05 14:36:38 0.range() 函数,其功能是创建一个整数列表,一般用在 for 循环中 语法格式:range ...

  7. handy源码阅读(四):Channel类

    通道,封装了可以进行epoll的一个fd. struct Channel: private noncopyable { Channel(EventBase* base, int fd, int eve ...

  8. Jupyter配置Spark开发环境

    兄弟连大数据培训和大家一起探究Jupyter配置 Spark 开发环境 简介 为Jupyter配置Spark开发环境,可以安装全家桶–Spark Kernel或Toree,也可按需安装相关组件. 考虑 ...

  9. (转)oracle触发器使用:after insert 与before insert的简单使用注意

    本文转载自:http://blog.csdn.net/kuangfengbuyi/article/details/41446125 创建触发器时,触发器类型为after insert , 在begin ...

  10. (转)用C#实现实现简单的 Ping 的功能,用于测试网络是否已经连通

    本文转载自:http://blog.csdn.net/xiamin/archive/2009/02/14/3889696.aspx 用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通 1 ...