模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块,文件或文件夹
- 内置模块
- 开源模块
一 第三方模块安装
1 # python 安装第三方模块 2 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+python的scripts路径 3 (1) python管理工具 pip 4 # python3 -m pip install requests # 3版本安装 5 6 (2) 源码安装 7 解压 8 cmd 9 进到你下载的包路径 10 python setup.py install #选择你要安装的Python版本。
windows下安装开源模块
报错
1 pip install django 2 Fatal error in launcher: Unable to create process using '"'
解决方法
1 python -m pip install package
1 如果找不到pip命令可以去scripts目录下 2 安装报错 3 C:\Python35\Scripts 4 λ pyip install django 5 Fatal error in launcher: Unable to create process using '"' 6 7 C:\Python35\Scripts 8 λ pip install django 9 Fatal error in launcher: Unable to create process using '"' 10 11 解决 python -m pip install package 12 13 C:\Python35\Scripts 14 λ python -m pip install requests 15 Collecting requests 16 Downloading requests-2.10.0-py2.py3-none-any.whl (506kB) 17 100% |████████████████████████████████| 507kB 144kB/s 18 Installing collected packages: requests 19 Successfully installed requests-2.10.0 20 You are using pip version 7.1.2, however version 8.1.2 is available. 21 You should consider upgrading via the 'python -m pip install --upgrade pip' command. 22 23 C:\Python35\Scripts 24 λ piython -m pip install django 25 Collecting django 26 Downloading Django-1.9.6-py2.py3-none-any.whl (6.6MB) 27 100% |████████████████████████████████| 6.6MB 64kB/s 28 Installing collected packages: django 29 Successfully installed django-1.9.6 30 You are using pip version 7.1.2, however version 8.1.2 is available. 31 You should consider upgrading via the 'python -m pip install --upgrade pip' command. 32 33 34 C:\Python35\Scripts 35 λ python3 -m pip install django 36 Collecting django 37 Using cached Django-1.9.6-py2.py3-none-any.whl 38 Installing collected packages: django 39 Successfully installed django-1.9.6 40 You are using pip version 7.1.2, however version 8.1.2 is available. 41 You should consider upgrading via the 'python -m pip install --upgrade pip' command.
二 自定义模块
也就是自己写的python脚本,而目录就是所谓的包
1 定义模块
2 导入模块
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
1 import module 2 from module.xx.xx import xx 3 from module.xx.xx import xx as rename 4 from module.xx.xx import *
2 .2 导入模块后如何调用
1 第一种: 2 from lib import account 3 ret = account.login() # 导入模块,这里方法调用必须用模块 4 print(ret) 5 第二种: 6 from lib.account import login #这里如果直接导入方法,需要包.模块 7 ret = login() 8 print(ret) 9 第三种 10 import lib.account #如果是直接import 11 ret = lib.account.login() #调用时候需要从头开始写 12 print(ret) 13 第四种: 14 from lib.account import login as l #as使用 15 ret = l() 16 print(ret) 17 18 19 account 文件 20 #!/usr/bin/env python 21 # _*_ coding:utf-8 _*_ 23 24 def login(): 25 return "login" 26 27 def register(): 28 return "register" 29 30 def logout(): 31 return "logout"
3 模块默认查找路径
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path,根据sys.path下的路径去找。
1 import sys 2 print(sys.path) 3 4 5 6 C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/mk.py 7 ['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('路径') 添加。
1 # 将d盘写的一个脚本加入到sys路径,这样D盘下面的py文件就可以作为模块直接用。 2 import sys 3 sys.path.append("D:") 4 import buy 5 ret = buy.fun() 6 print(ret)<br><br>
1 import sys 2 import os 3 4 pre_path = os.path.abspath('../') 5 sys.path.append(pre_path)
三 内置模块
1 、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') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ls 10 os.remove() 删除一个文件 rm 11 os.rename("oldname","newname") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息,包含文件大小。 13 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 输出用于分割文件路径的字符串 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所指向的文件或者目录的最后修改时间
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 4 import os 5 6 print(os.getcwd()) 7 # 测是 chdir 切换目录,切换到上级目录 8 # pwd =os.getcwd() 9 # li = pwd.split("\\") 10 # del li[-1] 11 # pwd='\\'.join(li) 12 # print(pwd) 13 # os.chdir(pwd) 14 # print(os.getcwd()) 15 16 print(os.curdir) # 返回. 17 a = os.pardir 18 print(a) # 返回是.. 19 # os.makedirs("a/b/c") 20 # os.makedirs("a/b") #在本层目录下创建a/b 21 # os.removedirs("a/b") # b为空,删除b后,a也为空,则都删除 否则哪级不为空就会报错 22 # os.mkdir("b") #创建目录 23 # print(os.listdir('a/b')) #列出目录内一层的内容包括隐藏目录 24 # os.remove('a/b/圣达菲.py') # 删除b下的文件 25 # os.rmdir("b")# 删除空目录 否则报错 26 # os.rename("a","b") # 重命名文件或者目录 27 # print(os.stat("b")) #获取目录信息 28 # print(os.sep) # 输出路径分隔符 linux / windows // 29 # print(os.linesep) #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 30 # print(os.pathsep) #输出用于分割文件路径的字符串 31 # print(os.name) #输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 32 # os.system("ip ro") #必须在linux手动执行脚本 33 # print(os.environ) #获取环境变量 34 # print(os.path.abspath("b")) # # 获取b目录规范化的绝对路径 35 # print(os.path.split("b")) #将传入的字符串路径分割成目录和文件名二元数组返回 ('', 'b') 36 print(os.path.dirname("a/b")) #获取最后一个目录之前的路径 37 print(os.path.exists('/b/c')) #判断是否存在 返回True 或者false 38 print(os.path.basename('a/b/c')) #获取最后一层目录 39 print(os.path.isabs('a/b/c')) #是否是绝对路径 40 print(os.path.isfile('b/sss')) #最后一个名是否是文件 返回True 或者false 41 print(os.path.isdir('a/b'))#最后一个名是否是目录 返回True 或者false 42 print(os.path.join("a/b/c","b/b")) #a/b/c\b/b 43 print(os.path.getatime("a/b/c")) 44 print(os.path.getmtime("a/b/c"))
案例:
根据用户输入创建目录
1 import os,sys 2 dirname = input("input ur dir name:").strip() 3 dir_path = os.getcwd() #获取当前脚本所在目录 4 new_path = r"%s\%s"%(dir_path,dirname) #拼接输入名与目录路径 5 if not os.path.exists(new_path): 6 os.mkdir(new_path)
os 模块常用 功能 dirname basename join
这里先介绍 内置函数vars()
每个py文件相当于一个模块,而这个文件的许多方法,可以用print(var())
1 print(vars()) 2 3 ----------------- 4 C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py 5 {'__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__
当前文件的路径,
返回当前文件的目录
1 print(__doc__) # python文件的注释 三引号 注释必须在开头, 2 3 print(__file__) #自身脚本文件加路径 4 print(__package__) # 当前文件为None 5 from s12_mokuai import s1 6 print(s1.__package__) # 导入模块文件的文件: 则输出导入模块文件的所在目录 7 8 # 9 # from s12_mokuai import s1 10 # print(s1.__cached__) #导入的文件,则输出其缓存目录
1 print(__cached__) #没有导入 当前文件的缓存为None,
文件路径及目录,获取文件名等等操作
1 import os 2 print(__file__)#文件的路径 3 print(os.path.dirname(__file__))#返回文件的目录,文件的上层 4 print(os.path.dirname(os.path.dirname(__file__)))#上层的上层 5 print(os.path.basename(__file__))#返回文件名 6 7 -------------------------- 8 9 C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py 10 E:/py/55/learn-python/oldboy/6/module_test2.py 11 E:/py/55/learn-python/oldboy/6 12 E:/py/55/learn-python/oldboy 13 module_test2.py
重点1 而 __name__的重要性不言而喻
当我们的程序只有一个入口的时候,如果加入if __name__ == "__main__": 那么我们程序主文件被导入的时候__name__的值是模块的名字,程序主程序是不执行的。
1 print(__name__) # 当执行该脚本时候输出为 __main__ 而当被导入的时候是其模块名称
# 主文件
# 调用主函数前,必须 if __name__ == "__main__":
重点2 __file__ #自身脚本文件加路径
假如当前脚本所在目录还有一个目录,python里面称为包,而这个包下有好多模块,也就是py文件,我们如果想调用,怎么用呢??这就用到os模块的 三个方法basename dirname join 还有我们刚提到的__file__ 还有 sys的path方法
1 import os,sys 2 print(os.path.dirname(__file__)) 3 p1 = os.path.dirname(__file__)#返回文件的目录,文件的上层 4 p2 = os.path.basename(__file__)#返回文件的文件名 5 new_dir = os.path.join(p1,p2)#拼接成路径 6 sys.path.append(new_dir)#加入到sys.path
2、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]
2.1 argv 将文件名和参数做成列表返回
1 import sys 2 print(sys.argv) 3 4 saltstack_s:/share/py_test/s8 # py s9_argv.py 9 9 9 9 5 ['s9_argv.py', '9', '9', '9', '9']
sys.stdout.write()
sys.stdout.flush()刷新屏幕缓存io
1 #进度条案例 2 import time,sys 3 for i in range(101): 4 #显示进度条百分比 #号从1开始 空格从99递减 5 hashes = '#' * int(i / 100.0 * 100) 6 spaces = ' ' * (100 - len(hashes)) 7 sys.stdout.write("\r[%s] %s%%" % (hashes + spaces, i)) #必须两个%%才是,因为一个%是取模,python解释器会默认过滤 8 sys.stdout.flush() #强制刷新屏幕缓冲区使其一行输出 9 time.sleep(0.05)
1 import time 2 import sys 3 for i in range(30): 4 sys.stdout.write('\r') 5 sys.stdout.write("%s%%|%s" % (int(i/30*100),int(i/30*100)*"*")) 6 sys.stdout.flush() 7 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()
1 print time.time() # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186 2 print time.mktime(time.localtime()) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0 3 4 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) 5 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) 6 print time.strptime('2014-11-11', '%Y-%m-%d') print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25 7 8 print time.strftime('%Y-%m-%d') #默认当前时间 9 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间 10 print time.asctime() 11 print time.asctime(time.localtime()) 12 print time.ctime(time.time()) 13 14 import datetime 15 ''' 16 datetime.date:表示日期的类。常用的属性有year, month, day 17 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond 18 datetime.datetime:表示日期时间 19 datetime.timedelta:表示时间间隔,即两个时间点之间的长度 20 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 21 strftime("%Y-%m-%d") 22 ''' 23 import datetime 24 print datetime.datetime.now() 25 print datetime.datetime.now() - datetime.timedelta(days=5)
3.1 time 模块练习
时间戳与日期之间的相互转化
1 当前时间戳:time.time() 2 当前日期:time.ctime() 3 1、Python下日期到时间戳的转换 4 import datetime 5 import time 6 dateC=datetime.datetime(2010,6,6,8,14,59) 7 timestamp=time.mktime(dateC.timetuple()) 8 print timestamp 9 10 2、Python下将时间戳转换到日期 11 import datetime 12 import time 13 ltime=time.localtime(1395025933) 14 timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime)
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 __author__ = 'liujianzuo' 4 import time 5 """ 6 时间相关的操作,时间有三种表示方式: 7 8 时间戳 1970年1月1日之后的秒,即:time.time() 9 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d') 10 结构化时间 元组包含了:等... time.struct_time 即:time.localtime() 11 """
1 ################## 时间戳 与 结构化时间 转换 ###################### 2 print(time.time()) # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186 3 print(time.ctime()) # 周 月 日 时间 年 Sat May 21 22:25:28 2016 4 print(time.ctime(time.time())) # 转换时间戳 为 Sat May 21 22:25:28 2016 5 print(time.ctime(time.time() - 86400)) # 转换时间戳 为 Sat May 21 22:25:28 2016 6 7 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) 8 obj = time.gmtime() 9 print(obj.tm_year) #获取结构化的时间年 2016 10 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) 11 #结构化时间 转换 时间戳 12 13 print(time.mktime(time.localtime())) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0 14 ################## ################## ################## ################## 15 16 ################## 结构化时间 与 字符串时间转换 ###################### 17 #将结构化的对象时间转换为字符串 trftime 即:time.struct_time(tm_year=2016, tm_mon=5,。。。) ===转换为=》 ”%Y-%m-%d %H:%M %s# “ 18 print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25 19 #将字符串日期 转换为 时间结构对象 strptime ”%Y-%m-%d %H:%M %s# “ ===转换为=》 time.struct_time(tm_year=2016, tm_mon=5,。。。) 20 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, 21 ################## ################## ################## ##################
3.2 datetime 模块练习
1 import datetime 2 ''' 3 datetime.date:表示日期的类。常用的属性有year, month, day 4 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond 5 datetime.datetime:表示日期时间 6 datetime.timedelta:表示时间间隔,即两个时间点之间的长度 7 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 8 strftime("%Y-%m-%d") 9 ''' 10 import datetime 11 print datetime.datetime.now() 12 print datetime.datetime.now() - datetime.timedelta(days=5)
1 # -*- coding: utf-8 -*- 2 3 4 #datetime类 5 #datetime是date与time的结合体,包括date与time的所有信息。 6 #它的构造函数如下: 7 #datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ) 8 #各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。 9 10 11 12 13 # 1. datetime类定义的类属性与方法: 14 #datetime.min、datetime.max:datetime所能表示的最小值与最大值; 15 #print: datetime.max: 9999-12-31 23:59:59.999999 16 #print: datetime.min: 0001-01-01 00:00:00 17 from datetime import * 18 import time 19 print 'datetime.max:' , datetime.max 20 print 'datetime.min:' , datetime.min 21 #datetime.resolution:datetime最小单位; 22 #print: datetime.resolution: 0:00:00.000001 23 print 'datetime.resolution:' , datetime.resolution 24 #datetime.today():返回一个表示当前本地时间的datetime对象; 25 #print: today(): 2012-09-12 19:37:50.721000 26 print 'today():' , datetime.today() 27 #datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间; 28 #print: now(): 2012-09-12 19:37:50.738000 29 print 'now():' , datetime.now() 30 #datetime.utcnow():返回一个当前utc时间的datetime对象; 31 #print: 2012-09-12 11:37:50.739000 32 print 'utcnow():' , datetime.utcnow() 33 #datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息; 34 #print: fromtimestamp(tmstmp): 2012-09-12 19:37:50.741000 35 print 'fromtimestamp(tmstmp):' , datetime.fromtimestamp(time.time()) 36 #datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象; 37 #print: utcfromtimestamp(tmstmp): 2012-09-12 11:37:50.742000 38 print 'utcfromtimestamp(tmstmp):' , datetime.utcfromtimestamp(time.time()) 39 #datetime.combine(date, time):根据date和time,创建一个datetime对象; 40 #print: datetime.combine(date,time): 2012-09-12 19:46:05 41 d = date(2012,9,12) 42 from datetime import * 43 t = time(19,46,5) 44 print 'datetime.combine(date,time): ',datetime.combine(d,t) 45 #datetime.strptime(date_string, format):将格式字符串转换为datetime对象; 46 #print: 2007-03-04 21:08:12 47 print datetime.strptime("2007-03-04 21:08:12", "%Y-%m-%d %H:%M:%S") 48 49 50 #2. datetime类提供的实例方法与属性 51 dt = datetime.strptime("2012-09-12 21:08:12", "%Y-%m-%d %H:%M:%S") 52 #print: 2012 9 12 21 8 12 0 None 53 print dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo 54 print dt.date() 55 print dt.time() 56 print dt.replace(year = 2013) 57 print dt.timetuple() 58 print dt.utctimetuple() 59 print dt.toordinal() 60 print dt.weekday() 61 print dt.isocalendar() 62 #print dt.isoformat([sep]) 63 #datetime. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple())); 64 65 66 #3. 格式字符串 67 # datetime. strftime (format) 68 # %a 星期的简写。如 星期三为Web 69 # %A 星期的全写。如 星期三为Wednesday 70 # %b 月份的简写。如4月份为Apr 71 # %B月份的全写。如4月份为April 72 # %c: 日期时间的字符串表示。(如: 04/07/10 10:43:39) 73 # %d: 日在这个月中的天数(是这个月的第几天) 74 # %f: 微秒(范围[0,999999]) 75 # %H: 小时(24小时制,[0, 23]) 76 # %I: 小时(12小时制,[0, 11]) 77 # %j: 日在年中的天数 [001,366](是当年的第几天) 78 # %m: 月份([01,12]) 79 # %M: 分钟([00,59]) 80 # %p: AM或者PM 81 # %S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~) 82 # %U: 周在当年的周数当年的第几周),星期天作为周的第一天 83 # %w: 今天在这周的天数,范围为[0, 6],6表示星期天 84 # %W: 周在当年的周数(是当年的第几周),星期一作为周的第一天 85 # %x: 日期字符串(如:04/07/10) 86 # %X: 时间字符串(如:10:43:39) 87 # %y: 2个数字表示的年份 88 # %Y: 4个数字表示的年份 89 # %z: 与utc时间的间隔 (如果是本地时间,返回空字符串) 90 # %Z: 时区名称(如果是本地时间,返回空字符串) 91 # %%: %% => % 92 93 94 dt = datetime.now() 95 #print: (%Y-%m-%d %H:%M:%S %f): 2012-09-12 23:04:27 145000 96 print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f') 97 #print: (%Y-%m-%d %H:%M:%S %p): 12-09-12 11:04:27 PM 98 print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p') 99 #print: %a: Wed 100 print '%%a: %s ' % dt.strftime('%a') 101 #print: %A: Wednesday 102 print '%%A: %s ' % dt.strftime('%A') 103 #print: %b: Sep 104 print '%%b: %s ' % dt.strftime('%b') 105 #print: %B: September 106 print '%%B: %s ' % dt.strftime('%B') 107 #print: 日期时间%c: 09/12/12 23:04:27 108 print '日期时间%%c: %s ' % dt.strftime('%c') 109 #print: 日期%x:09/12/12 110 print '日期%%x:%s ' % dt.strftime('%x') 111 #print: 时间%X:23:04:27 112 print '时间%%X:%s ' % dt.strftime('%X') 113 #print: 今天是这周的第3天 114 print '今天是这周的第%s天 ' % dt.strftime('%w') 115 #print: 今天是今年的第256天 116 print '今天是今年的第%s天 ' % dt.strftime('%j') 117 #print: 今周是今年的第37周 118 print '今周是今年的第%s周 ' % dt.strftime('%U')
4 hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1 import hashlib 2 3 # ######## md5 ######## 4 5 hash = hashlib.md5() 6 hash.update(bytes("admin",encoding="utf-8")) 7 print(hash.hexdigest()) 8 9 # ######## sha1 ######## 10 11 hash = hashlib.sha1() 12 hash.update(bytes("admin",encoding="utf-8")) 13 print(hash.hexdigest()) 14 15 # ######## sha256 ######## 16 17 hash = hashlib.sha256() 18 hash.update(bytes("admin",encoding="utf-8")) 19 print(hash.hexdigest()) 20 21 # ######## sha384 ######## 22 23 hash = hashlib.sha384() 24 hash.update(bytes("admin",encoding="utf-8")) 25 print(hash.hexdigest()) 26 27 # ######## sha512 ######## 28 29 hash = hashlib.sha512() 30 hash.update(bytes("admin",encoding="utf-8")) 31 print(hash.hexdigest())
加盐
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
1 ######## md5 加盐######## 2 3 hash = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8")) 4 5 hash.update(bytes("admin",encoding="utf-8")) 6 print(hash.hexdigest())
1 obj = hashlib.md5(bytes("salt;%#%salt", encoding="utf-8")) # 这里是输入的盐值 ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文 2 print(obj) # <md5 HASH object @ 0x0000000000A1F800> 3 obj.update(bytes("mypasswd123", encoding="utf-8")) # 更新哈希对象以字符串参数 其实就是你的明文密码 4 print(obj.digest()) ##返回摘要,作为二进制数据字符串值 b'\x04\x80)\x17\\\xf8dPA\xbc\xd9@e\xeb&\x0f' 5 print(obj.hexdigest()) # 返回十六进制数字字符串 048029175cf8645041bcd94065eb260f
HMAC加密:
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
消息认证算法:MAC (Message Authentication Codes) 消息认证码
1 import hmac 2 h = hmac.new('wupeiqi') 3 h.update('hellowo') 4 print h.hexdigest()
1 对称加密: 2 加密算法 + 口令 3 明文 --> 密文 4 5 字典攻击 6 7 20位:100^20=10^32 8 9 加密方,解密方使用同一个口令 10 11 加密算法: 12 DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des 13 AES:128位 高级加密标准 14 3DES:3次加密后的 15 16 加密方,解密方使用同一个口令 17 DES(56bits), 3DES, AES(128bits), Blowfish 18 Twofish, IDEA, RC6, CAST5, Serpent 19 20 block 21 22 特性:1、加密/解密使用同一口令 23 2、将原文分割成固定大小的数据块,对这些进行加密 24 ECB, CBC 25 密钥交换(IKE: Internet Key Exchange):DH算法 发明者两个人的名字首字母 26 27 非对称加密: :本地生成一对钥匙,公钥私钥,公钥是可以公开的,私钥是自己的。跟别人通信,就把对方的公钥要过来,加密完,只有对方才能解开。 28 由于加密太长,所以不用来加密数据。用对称密码加密数据,用非对称密码的钥匙加密身份 29 30 加密算法:RSA, EIGamal, DSA 31 32 1、密钥交换 33 2、身份认证 34 单向加密: 35 抽取数据特征码: 36 MD5, SHA1, SHA512, CRC-32(循环冗余校验码) 37 38 1、完整性 39 40 消息认证算法:MAC (Message Authentication Codes) 消息认证码 41 CBC-MAC 42 HMAC: 43 44 雪崩效应: 45 定长输入: 46 47 48 49 数据加密: 抽取数据特征码用单向加密,再用非对称加密特征码,加在数据前面,然后在用对称加密,然后再用对方的公钥加密数据。发送出去。
注册 登陆案例
1 import hashlib 2 3 def md5(args): 4 hs=hashlib.md5() 5 hs.update(bytes(args,encoding="utf-8")) 6 return hs.hexdigest() 7 8 9 def register(us,pw): 10 with open("db","a",encoding="utf-8") as f: 11 temp=us+"|"+md5(pw)+"\n" 12 f.write(temp) 13 def login(us,pw): 14 with open("db","r",encoding="utf-8") as f: 15 for i in f: 16 u,p=i.strip().split("|") 17 if u==us and md5(pw)==p: 18 return True 19 ch=int(input("1.登陆\n2.注册")) 20 if ch==2: 21 user=input("用户名:") 22 pwd=input("密码:") 23 register(user,pwd) 24 if ch==1: 25 user = input("用户名:") 26 pwd = input("密码:") 27 r=login(user,pwd) 28 if r: 29 print("登陆成功") 30 else: 31 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不识别单引号,而且,整个字符串必须被单引号或者三个引号引起来,否则报错
1 import json 2 3 # s = "{'data':'invilad','status':'1000'}" # json 认为里面必须是双引号才会处理,否则会报错,这样会报错 4 s1='{"data":"invilad","status":"1000"}' # json 认为里面必须是双引号才会处理,否则会报错,不会报错 5 s2="""{"data":"invilad","status":"1000"}""" # json 认为里面必须是双引号才会处理,否则会报错,不会报错 6 l = "[1,2,3]" 7 # ret = json.loads(s) # loads 将形似python数据类型列表或字典的字符串转换成 列表或者字典 8 ret2=json.loads(s1) 9 ret3=json.loads(s2) 10 # print(ret, type(ret)) 11 print(ret2,type(ret2)) 12 print(ret3,type(ret3))
dumps 方法 将python数据类型列表或字典转换成形似列表或者字典的字符串
1 n = {'status': '1000', 'data': 'invilad'} 2 m = [1, 2, 3] 3 ret1 = json.dumps(n) # dumps 将python数据类型列表或字典转换成形似列表或者字典的字符串 4 print(ret1,type(ret1)) # {"data": "invilad", "status": "1000"} <class 'str'> 5 ret1 = json.dumps(m) 6 print(ret1,type(ret1)) # [1, 2, 3] <class 'str'>
dump 和load 的用法
1 n = {'status': '1000', 'data': 'invilad'} 2 m = [1, 2, 3] 3 # json.dump(n,open("json_test",'w'))# dump 功能就是 先转换为字符串,再写入文件 4 r = json.load(open("json_test",'r'))# load 功能就是 读取文件字符串 并转化为python数据类型 5 print(r,type(r))
知识点2 :我们接收的网页请求过来是字符串或者字节
1 from urllib import request 2 3 f = request.urlopen("http://www.cnblogs.com/") #获取网站内容,作为对象 4 # f = request.urlopen("http://yujuanfudan.blog.163.com/") 5 ret = f.read() #对象的read方法读出来,和文件类似 6 print(type(ret)) #初始是bytes类型 7 print(str(ret, encoding="utf-8")) #转成字符串类型
7 requests 第三方模块
Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
发送GET请求
1 import urllib.request 2 3 4 f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') 5 result = f.read().decode('utf-8') 6 print(result)
发送携带请求头的GET请求
1 import urllib.request 2 3 req = urllib.request.Request('http://www.example.com/') 4 req.add_header('Referer', 'http://www.python.org/') 5 r = urllib.request.urlopen(req) 6 7 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、使用模块
1 import requests,json 2 res=requests.get("http://www.weather.com.cn/adat/sk/101010500.html") 3 res.encoding="utf-8" 4 result=res.text #通过text拿到一个字符串 5 print(result,type(result)) 6 dic=json.loads(result) #通过json.loads转化成字典 7 print(dic,type(dic))
1 # 1、无参数实例 2 3 import requests 4 5 ret = requests.get('https://github.com/timeline.json') 6 7 print(ret.url) 8 print(ret.text) 9 10 11 12 # 2、有参数实例 13 14 import requests 15 16 payload = {'key1': 'value1', 'key2': 'value2'} 17 ret = requests.get("http://httpbin.org/get", params=payload) 18 19 print(ret.url) 20 print(ret.text) 21 22 GET请求
1 # 1、基本POST实例 2 3 import requests 4 5 payload = {'key1': 'value1', 'key2': 'value2'} 6 ret = requests.post("http://httpbin.org/post", data=payload) 7 8 print(ret.text) 9 10 11 # 2、发送请求头和数据实例 12 13 import requests 14 import json 15 16 url = 'https://api.github.com/some/endpoint' 17 payload = {'some': 'data'} 18 headers = {'content-type': 'application/json'} 19 20 ret = requests.post(url, data=json.dumps(payload), headers=headers) 21 22 print(ret.text) 23 print(ret.cookies) 24 25 POST请求
1 requests.get(url, params=None, **kwargs) 2 requests.post(url, data=None, json=None, **kwargs) 3 requests.put(url, data=None, **kwargs) 4 requests.head(url, **kwargs) 5 requests.delete(url, **kwargs) 6 requests.patch(url, data=None, **kwargs) 7 requests.options(url, **kwargs) 8 9 # 以上方法均是在此方法的基础上构建 10 requests.request(method, url, **kwargs) 11 12 其他请求
更多requests模块相关的文档见:http://cn.python-requests.org/zh_CN/latest/
3、Http请求和XML实例
实例:检测QQ账号是否在线
1 import urllib 2 import requests 3 from xml.etree import ElementTree as ET 4 5 # 使用内置模块urllib发送HTTP请求,或者XML格式内容 6 """ 7 f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') 8 result = f.read().decode('utf-8') 9 """ 10 11 12 # 使用第三方模块requests发送HTTP请求,或者XML格式内容 13 r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') 14 result = r.text 15 16 # 解析XML格式内容 17 node = ET.XML(result) 18 19 # 获取内容 20 if node.text == "Y": 21 print("在线") 22 else: 23 print("离线")
实例:查看火车停靠信息
1 import urllib 2 import requests 3 from xml.etree import ElementTree as ET 4 5 # 使用内置模块urllib发送HTTP请求,或者XML格式内容 6 """ 7 f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=') 8 result = f.read().decode('utf-8') 9 """ 10 11 # 使用第三方模块requests发送HTTP请求,或者XML格式内容 12 r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=') 13 result = r.text 14 15 # 解析XML格式内容 16 root = ET.XML(result) 17 for node in root.iter('TrainDetailInfo'): 18 print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)
注:更多接口猛击这里
8 xml模块
安装requests 模块
查看天气状况
1 import requests,json 2 res=requests.get("http://www.weather.com.cn/adat/sk/101010500.html") 3 res.encoding="utf-8" 4 result=res.text #通过text拿到一个字符串 5 print(result,type(result)) 6 dic=json.loads(result) #通过json.loads转化成字典 7 print(dic,type(dic))
xml 讲解:
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:
first.xml
1 <data> 2 <country name="Liechtenstein"> 3 <rank updated="yes">2</rank> 4 <year>2023</year> 5 <gdppc>141100</gdppc> 6 <neighbor direction="E" name="Austria" /> 7 <neighbor direction="W" name="Switzerland" /> 8 </country> 9 <country name="Singapore"> 10 <rank updated="yes">5</rank> 11 <year>2026</year> 12 <gdppc>59900</gdppc> 13 <neighbor direction="N" name="Malaysia" /> 14 </country> 15 <country name="Panama"> 16 <rank updated="yes">69</rank> 17 <year>2026</year> 18 <gdppc>13600</gdppc> 19 <neighbor direction="W" name="Costa Rica" /> 20 <neighbor direction="E" name="Colombia" /> 21 </country> 22 </data>
1 # 第一种,这种修改不了xml文件的内容 2 # 循环获取多级节点 标签 3 import requests 4 from xml.etree import ElementTree as ET 5 # f = open("first.xml","r",encoding="utf-8") 6 # ret = ET.XML(f.read()) 7 # 8 # for node in ret: 9 # print(node.find("rank").text) # find的查找值一定要是 有text的内容的标签 10 # 11 # # for node_node in node: 12 # for node__ in node_node: 13 # print(node__.find("rank")) 14 # for node in ret.iter("country"): 15 # print(node.find("year").text) 16 17 课上代码
1、解析XML
利用ElementTree.XML将字符串解析成xml对象
1 from xml.etree import ElementTree as ET 2 3 4 # 打开文件,读取XML内容 5 str_xml = open('xo.xml', 'r').read() 6 7 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 8 root = ET.XML(str_xml) 9 10 利用ElementTree.XML将字符串解析成xml对象
#利用ElementTree.parse将文件直接解析成xml对象
1 from xml.etree import ElementTree as ET 2 3 # 直接解析xml文件 4 tree = ET.parse("xo.xml") 5 6 # 获取xml文件的根节点 7 root = tree.getroot() 8 9 #利用ElementTree.parse将文件直接解析成xml对象
xml解析和保存的方式
1 # 解析xml 2 # 1 接口url 请求get获得的字符串类型 XML 3 # import requests 4 # from xml.etree import ElementTree as ET 5 # r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=") 6 # result = r.text 7 # # 将 请求的字符串结果 通过xml的模块的方法转换成xml格式 8 # ret = ET.XML(result) 9 # ==============分隔符====如下是文件句柄 读取的字符串 10 # from xml.etree import ElementTree as ET 11 # f = open("first.xml","r",encoding="utf-8") 12 # ret = ET.XML(f.read()) 13 # 14 # 对于 上面的这种 是Element对象,而不是ElementTree对象,因此不能够write到文件,但是 15 #我们可以 先创建ElementTree对象 16 # tree = ElementTree(ret) #将ret这个Element对象对应的内存的xml字符串 传给ElementTree类 做成ElementTree对象 17 # tree.write("new.xml") 18 # 2 文件类型的xml文档 parse 19 #from xml.etree import ElementTree as ET 20 # n = ET.parse("first.xml") 21 # 22 # ret = n.getroot() # getroot方法拿到根节点 23 24 # son = ET.Element("Biaoqian2",{"key":"value"}) 25 # son.text="zhi" 26 # ele1 = ET.Element("qq",key2="value2", ) 27 # ele1.text="woshizhi" 28 # ret.append(son) 29 # son.append(ele1) 30 # n.write("out2.xml") 31 32 xml解析和保存的方式
2、操作XML
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
1 class Element: 2 """An XML element. 3 4 This class is the reference implementation of the Element interface. 5 6 An element's length is its number of subelements. That means if you 7 want to check if an element is truly empty, you should check BOTH 8 its length AND its text attribute. 9 10 The element tag, attribute names, and attribute values can be either 11 bytes or strings. 12 13 *tag* is the element name. *attrib* is an optional dictionary containing 14 element attributes. *extra* are additional element attributes given as 15 keyword arguments. 16 17 Example form: 18 <tag attrib>text<child/>...</tag>tail 19 20 """ 21 22 当前节点的标签名 23 tag = None 24 """The element's name.""" 25 26 当前节点的属性 27 28 attrib = None 29 """Dictionary of the element's attributes.""" 30 31 当前节点的内容 32 text = None 33 """ 34 Text before first subelement. This is either a string or the value None. 35 Note that if there is no text, this attribute may be either 36 None or the empty string, depending on the parser. 37 38 """ 39 40 tail = None 41 """ 42 Text after this element's end tag, but before the next sibling element's 43 start tag. This is either a string or the value None. Note that if there 44 was no text, this attribute may be either None or an empty string, 45 depending on the parser. 46 47 """ 48 49 def __init__(self, tag, attrib={}, **extra): 50 if not isinstance(attrib, dict): 51 raise TypeError("attrib must be dict, not %s" % ( 52 attrib.__class__.__name__,)) 53 attrib = attrib.copy() 54 attrib.update(extra) 55 self.tag = tag 56 self.attrib = attrib 57 self._children = [] 58 59 def __repr__(self): 60 return "<%s %r at %#x>" % (self.__class__.__name__, self.tag, id(self)) 61 62 def makeelement(self, tag, attrib): 63 创建一个新节点 64 """Create a new element with the same type. 65 66 *tag* is a string containing the element name. 67 *attrib* is a dictionary containing the element attributes. 68 69 Do not call this method, use the SubElement factory function instead. 70 71 """ 72 return self.__class__(tag, attrib) 73 74 def copy(self): 75 """Return copy of current element. 76 77 This creates a shallow copy. Subelements will be shared with the 78 original tree. 79 80 """ 81 elem = self.makeelement(self.tag, self.attrib) 82 elem.text = self.text 83 elem.tail = self.tail 84 elem[:] = self 85 return elem 86 87 def __len__(self): 88 return len(self._children) 89 90 def __bool__(self): 91 warnings.warn( 92 "The behavior of this method will change in future versions. " 93 "Use specific 'len(elem)' or 'elem is not None' test instead.", 94 FutureWarning, stacklevel=2 95 ) 96 return len(self._children) != 0 # emulate old behaviour, for now 97 98 def __getitem__(self, index): 99 return self._children[index] 100 101 def __setitem__(self, index, element): 102 # if isinstance(index, slice): 103 # for elt in element: 104 # assert iselement(elt) 105 # else: 106 # assert iselement(element) 107 self._children[index] = element 108 109 def __delitem__(self, index): 110 del self._children[index] 111 112 def append(self, subelement): 113 为当前节点追加一个子节点 114 """Add *subelement* to the end of this element. 115 116 The new element will appear in document order after the last existing 117 subelement (or directly after the text, if it's the first subelement), 118 but before the end tag for this element. 119 120 """ 121 self._assert_is_element(subelement) 122 self._children.append(subelement) 123 124 def extend(self, elements): 125 为当前节点扩展 n 个子节点 126 """Append subelements from a sequence. 127 128 *elements* is a sequence with zero or more elements. 129 130 """ 131 for element in elements: 132 self._assert_is_element(element) 133 self._children.extend(elements) 134 135 def insert(self, index, subelement): 136 在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置 137 """Insert *subelement* at position *index*.""" 138 self._assert_is_element(subelement) 139 self._children.insert(index, subelement) 140 141 def _assert_is_element(self, e): 142 # Need to refer to the actual Python implementation, not the 143 # shadowing C implementation. 144 if not isinstance(e, _Element_Py): 145 raise TypeError('expected an Element, not %s' % type(e).__name__) 146 147 def remove(self, subelement): 148 在当前节点在子节点中删除某个节点 149 """Remove matching subelement. 150 151 Unlike the find methods, this method compares elements based on 152 identity, NOT ON tag value or contents. To remove subelements by 153 other means, the easiest way is to use a list comprehension to 154 select what elements to keep, and then use slice assignment to update 155 the parent element. 156 157 ValueError is raised if a matching element could not be found. 158 159 """ 160 # assert iselement(element) 161 self._children.remove(subelement) 162 163 def getchildren(self): 164 获取所有的子节点(废弃) 165 """(Deprecated) Return all subelements. 166 167 Elements are returned in document order. 168 169 """ 170 warnings.warn( 171 "This method will be removed in future versions. " 172 "Use 'list(elem)' or iteration over elem instead.", 173 DeprecationWarning, stacklevel=2 174 ) 175 return self._children 176 177 def find(self, path, namespaces=None): 178 获取第一个寻找到的子节点 179 """Find first matching element by tag name or path. 180 181 *path* is a string having either an element tag or an XPath, 182 *namespaces* is an optional mapping from namespace prefix to full name. 183 184 Return the first matching element, or None if no element was found. 185 186 """ 187 return ElementPath.find(self, path, namespaces) 188 189 def findtext(self, path, default=None, namespaces=None): 190 获取第一个寻找到的子节点的内容 191 """Find text for first matching element by tag name or path. 192 193 *path* is a string having either an element tag or an XPath, 194 *default* is the value to return if the element was not found, 195 *namespaces* is an optional mapping from namespace prefix to full name. 196 197 Return text content of first matching element, or default value if 198 none was found. Note that if an element is found having no text 199 content, the empty string is returned. 200 201 """ 202 return ElementPath.findtext(self, path, default, namespaces) 203 204 def findall(self, path, namespaces=None): 205 获取所有的子节点 206 """Find all matching subelements by tag name or path. 207 208 *path* is a string having either an element tag or an XPath, 209 *namespaces* is an optional mapping from namespace prefix to full name. 210 211 Returns list containing all matching elements in document order. 212 213 """ 214 return ElementPath.findall(self, path, namespaces) 215 216 def iterfind(self, path, namespaces=None): 217 获取所有指定的节点,并创建一个迭代器(可以被for循环) 218 """Find all matching subelements by tag name or path. 219 220 *path* is a string having either an element tag or an XPath, 221 *namespaces* is an optional mapping from namespace prefix to full name. 222 223 Return an iterable yielding all matching elements in document order. 224 225 """ 226 return ElementPath.iterfind(self, path, namespaces) 227 228 def clear(self): 229 清空节点 230 """Reset element. 231 232 This function removes all subelements, clears all attributes, and sets 233 the text and tail attributes to None. 234 235 """ 236 self.attrib.clear() 237 self._children = [] 238 self.text = self.tail = None 239 240 def get(self, key, default=None): 241 获取当前节点的属性值 242 """Get element attribute. 243 244 Equivalent to attrib.get, but some implementations may handle this a 245 bit more efficiently. *key* is what attribute to look for, and 246 *default* is what to return if the attribute was not found. 247 248 Returns a string containing the attribute value, or the default if 249 attribute was not found. 250 251 """ 252 return self.attrib.get(key, default) 253 254 def set(self, key, value): 255 为当前节点设置属性值 256 """Set element attribute. 257 258 Equivalent to attrib[key] = value, but some implementations may handle 259 this a bit more efficiently. *key* is what attribute to set, and 260 *value* is the attribute value to set it to. 261 262 """ 263 self.attrib[key] = value 264 265 def keys(self): 266 获取当前节点的所有属性的 key 267 268 """Get list of attribute names. 269 270 Names are returned in an arbitrary order, just like an ordinary 271 Python dict. Equivalent to attrib.keys() 272 273 """ 274 return self.attrib.keys() 275 276 def items(self): 277 获取当前节点的所有属性值,每个属性都是一个键值对 278 """Get element attributes as a sequence. 279 280 The attributes are returned in arbitrary order. Equivalent to 281 attrib.items(). 282 283 Return a list of (name, value) tuples. 284 285 """ 286 return self.attrib.items() 287 288 def iter(self, tag=None): 289 在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。 290 """Create tree iterator. 291 292 The iterator loops over the element and all subelements in document 293 order, returning all elements with a matching tag. 294 295 If the tree structure is modified during iteration, new or removed 296 elements may or may not be included. To get a stable set, use the 297 list() function on the iterator, and loop over the resulting list. 298 299 *tag* is what tags to look for (default is to return all elements) 300 301 Return an iterator containing all the matching elements. 302 303 """ 304 if tag == "*": 305 tag = None 306 if tag is None or self.tag == tag: 307 yield self 308 for e in self._children: 309 yield from e.iter(tag) 310 311 # compatibility 312 def getiterator(self, tag=None): 313 # Change for a DeprecationWarning in 1.4 314 warnings.warn( 315 "This method will be removed in future versions. " 316 "Use 'elem.iter()' or 'list(elem.iter())' instead.", 317 PendingDeprecationWarning, stacklevel=2 318 ) 319 return list(self.iter(tag)) 320 321 def itertext(self): 322 在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。 323 """Create text iterator. 324 325 The iterator loops over the element and all subelements in document 326 order, returning all inner text. 327 328 """ 329 tag = self.tag 330 if not isinstance(tag, str) and tag is not None: 331 return 332 if self.text: 333 yield self.text 334 for e in self: 335 yield from e.itertext() 336 if e.tail: 337 yield e.tail 338 339 节点功能一览表
由于 每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),so 可以利用以上方法进行操作xml文件。
解析文件方法
1 先open文件获得文件句柄 ,然后通过ElementTree.XML方法
2 ElementTree.parse(file_name)
a. 遍历XML文档的所有内容
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式一 ############ 4 """ 5 # 打开文件,读取XML内容 6 str_xml = open('xo.xml', 'r').read() 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 """ 11 ############ 解析方式二 ############ 12 13 # 直接解析xml文件 14 tree = ET.parse("xo.xml") 15 16 # 获取xml文件的根节点 17 root = tree.getroot() 18 19 20 ### 操作 21 22 # 顶层标签 23 print(root.tag) 24 25 26 # 遍历XML文档的第二层 27 for child in root: 28 # 第二层节点的标签名称和标签属性 29 print(child.tag, child.attrib) 30 # 遍历XML文档的第三层 31 for i in child: 32 # 第二层节点的标签名称和内容 33 print(i.tag,i.text)
b、遍历XML中指定的节点
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式一 ############ 4 """ 5 # 打开文件,读取XML内容 6 str_xml = open('xo.xml', 'r').read() 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 """ 11 ############ 解析方式二 ############ 12 13 # 直接解析xml文件 14 tree = ET.parse("xo.xml") 15 16 # 获取xml文件的根节点 17 root = tree.getroot() 18 19 20 ### 操作 21 22 # 顶层标签 23 print(root.tag) 24 25 26 # 遍历XML中所有的year节点 27 for node in root.iter('year'): 28 # 节点的标签名称和内容 29 print(node.tag, node.text)
c、修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。
1 解析字符串方式,修改,保存
以open文件句柄方式打开文件并解析的文件,要最后生成ElementTree对象才能write
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式一 ############ 4 5 # 打开文件,读取XML内容 6 str_xml = open('xo.xml', 'r').read() 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 11 ############ 操作 ############ 12 13 # 顶层标签 14 print(root.tag) 15 16 # 循环所有的year节点 17 for node in root.iter('year'): 18 # 将year节点中的内容自增一 19 new_year = int(node.text) + 1 20 node.text = str(new_year) 21 22 # 设置属性 23 node.set('name', 'alex') 24 node.set('age', '18') 25 # 删除属性 26 del node.attrib['name'] 27 28 29 ############ 保存文件 ############ 30 因为root是ElementTree.Element对象,没有write方法,只有ElementTree有write方法,可以将root对应的内存地址内容传给ElementTree,实例化成ElementTree对象,就有write方法了 31 32 33 tree = ET.ElementTree(root) 34 tree.write("newnew.xml", encoding='utf-8') #如果更改内容有中文就需要指定编码了
2 解析文件方式,修改,保存
而以parse打开的文件,就是ElementTree对象,就有write方法
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式二 ############ 4 5 # 直接解析xml文件 6 tree = ET.parse("xo.xml") 7 8 # 获取xml文件的根节点 9 root = tree.getroot() 10 11 ############ 操作 ############ 12 13 # 顶层标签 14 print(root.tag) 15 16 # 循环所有的year节点 17 for node in root.iter('year'): 18 # 将year节点中的内容自增一 19 new_year = int(node.text) + 1 20 node.text = str(new_year) 21 22 # 设置属性 23 node.set('name', 'alex') 24 node.set('age', '18') 25 # 删除属性 26 del node.attrib['name'] 27 28 29 ############ 保存文件 ############ 30 tree.write("newnew.xml", encoding='utf-8')
d、删除节点
1 解析字符串方式打开,删除,保存
Element对象的remove方法 以 open方式打开如何保存
1 from xml.etree import ElementTree as ET 2 3 ############ 解析字符串方式打开 ############ 4 5 # 打开文件,读取XML内容 6 str_xml = open('xo.xml', 'r').read() 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 11 ############ 操作 ############ 12 13 # 顶层标签 14 print(root.tag) 15 16 # 遍历data下的所有country节点 17 for country in root.findall('country'): 18 # 获取每一个country节点下rank节点的内容 19 rank = int(country.find('rank').text) 20 21 if rank > 50: 22 # 删除指定country节点 23 root.remove(country) 24 25 ############ 保存文件 ############ 26 tree = ET.ElementTree(root) 27 tree.write("newnew.xml", encoding='utf-8') 28 29 Element对象的remove方法 以 open方式打开如何保存
2 解析文件方式打开,删除,保存
Element对象 remove 方法 以parse方法打开xml文件保存方法
1 from xml.etree import ElementTree as ET 2 3 ############ 解析文件方式 ############ 4 5 # 直接解析xml文件 6 tree = ET.parse("xo.xml") 7 8 # 获取xml文件的根节点 9 root = tree.getroot() 10 11 ############ 操作 ############ 12 13 # 顶层标签 14 print(root.tag) 15 16 # 遍历data下的所有country节点 17 for country in root.findall('country'): 18 # 获取每一个country节点下rank节点的内容 19 rank = int(country.find('rank').text) 20 21 if rank > 50: 22 # 删除指定country节点 23 root.remove(country) 24 25 ############ 保存文件 ############ 26 tree.write("newnew.xml", encoding='utf-8') 27 28 Element对象 remove 方法 以parse方法打开xml文件保存方法
3、创建XML文档
类型str 等类 创建字符串有两种方式生成 a = 'name' a = str("name")
创建方式(一) 类 Element(标签,{属性:值})
1 from xml.etree import ElementTree as ET 2 3 4 # 创建根节点 5 root = ET.Element("famliy") 6 7 8 # 创建节点大儿子 9 son1 = ET.Element('son', {'name': '儿1'}) 10 # 创建小儿子 11 son2 = ET.Element('son', {"name": '儿2'}) 12 13 # 在大儿子中创建两个孙子 14 grandson1 = ET.Element('grandson', {'name': '儿11'}) 15 grandson2 = ET.Element('grandson', {'name': '儿12'}) 16 son1.append(grandson1) 17 son1.append(grandson2) 18 19 20 # 把儿子添加到根节点中 21 root.append(son1) 22 root.append(son1) 23 24 tree = ET.ElementTree(root) 25 tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) 26 27 Element 创建xml方式
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 __author__ = 'liujianzuo' 4 5 from xml.etree import ElementTree as ET 6 tree = ET.parse("first.xml") # 直接解析xml格式文件 7 8 root = tree.getroot() #利用getroot方法获取根节点 9 # print(root.tag) 10 # print(root.attrib) 11 # print(root.text) 12 13 # 同 字符串创建的两种方式来看 xml也有两种方式创建 14 #2 利用 Element类直接创建 ====== 15 son = ET.Element("Biaoqian2",{"key":"value"}) 16 son.text="zhi" 17 ele1 = ET.Element("qq",key2="value2", ) 18 ele1.text="woshizhi" 19 root.append(son) 20 son.append(ele1) 21 tree.write("out2.xml") 22 23 在已有文件获取根节点情况 利用Element创建 二级三级节点
创建方式(二)
1 from xml.etree import ElementTree as ET 2 3 # 创建根节点 4 root = ET.Element("famliy") 5 6 7 # 创建大儿子 8 # son1 = ET.Element('son', {'name': '儿1'}) 9 son1 = root.makeelement('son', {'name': '儿1'}) 10 # 创建小儿子 11 # son2 = ET.Element('son', {"name": '儿2'}) 12 son2 = root.makeelement('son', {"name": '儿2'}) 13 14 # 在大儿子中创建两个孙子 15 # grandson1 = ET.Element('grandson', {'name': '儿11'}) 16 grandson1 = son1.makeelement('grandson', {'name': '儿11'}) 17 # grandson2 = ET.Element('grandson', {'name': '儿12'}) 18 grandson2 = son1.makeelement('grandson', {'name': '儿12'}) 19 20 son1.append(grandson1) 21 son1.append(grandson2) 22 23 24 # 把儿子添加到根节点中 25 root.append(son1) 26 root.append(son1) 27 28 tree = ET.ElementTree(root) 29 tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) 30 31 利用 makeelement创建 Element类的对象 创建一个新文件
1 from xml.etree import ElementTree as ET 2 tree = ET.parse("first.xml") # 直接解析xml格式文件 3 4 root = tree.getroot() #利用getroot方法获取根节点 5 print(root.tag) 6 print(root.attrib) 7 print(root.text) 8 9 # 同 字符串创建的两种方式来看 xml也有两种方式创建 10 # 11 # 1 利用 makeelement创建 Element类的对象 ===== 12 son = root.makeelement("biaoqian",{"key":"value"}) 13 14 s = son.makeelement("biaoqian2",{"key2":"value"}) #Element类的对象 15 16 son.append(s) #传入根的儿子的儿子 17 root.append(son) # 传入根节点下,作为儿子 18 19 tree.write("out.xml") 20 21 已有文件first.xml 利用 makeelement创建 Element类的对象
创建方式(三)
1 from xml.etree import ElementTree as ET 2 3 4 # 创建根节点 5 root = ET.Element("famliy") 6 7 8 # 创建节点大儿子 9 son1 = ET.SubElement(root, "son", attrib={'name': '儿1'}) 10 # 创建小儿子 11 son2 = ET.SubElement(root, "son", attrib={"name": "儿2"}) 12 13 # 在大儿子中创建一个孙子 14 grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'}) 15 grandson1.text = '孙子' 16 17 18 et = ET.ElementTree(root) #生成文档对象 19 et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False) 20 21 SubElement创建
将生成的xml的标签加缩进后写入新文件
由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:
1 from xml.etree import ElementTree as ET 2 from xml.dom import minidom 3 4 5 def prettify(elem): 6 """将节点转换成字符串,并添加缩进。 7 """ 8 rough_string = ET.tostring(elem, 'utf-8') 9 reparsed = minidom.parseString(rough_string) 10 return reparsed.toprettyxml(indent="\t") 11 12 # 创建根节点 13 root = ET.Element("famliy") 14 15 16 # 创建大儿子 17 # son1 = ET.Element('son', {'name': '儿1'}) 18 son1 = root.makeelement('son', {'name': '儿1'}) 19 # 创建小儿子 20 # son2 = ET.Element('son', {"name": '儿2'}) 21 son2 = root.makeelement('son', {"name": '儿2'}) 22 23 # 在大儿子中创建两个孙子 24 # grandson1 = ET.Element('grandson', {'name': '儿11'}) 25 grandson1 = son1.makeelement('grandson', {'name': '儿11'}) 26 # grandson2 = ET.Element('grandson', {'name': '儿12'}) 27 grandson2 = son1.makeelement('grandson', {'name': '儿12'}) 28 29 son1.append(grandson1) 30 son1.append(grandson2) 31 32 33 # 把儿子添加到根节点中 34 root.append(son1) 35 root.append(son1) 36 37 38 raw_str = prettify(root) 39 40 f = open("xxxoo.xml",'w',encoding='utf-8') 41 f.write(raw_str) 42 f.close() 43 44 Element 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件
函数封装了 缩进和写入文件的功能
1 from xml.etree import ElementTree as ET 2 from xml.dom import minidom 3 4 def MyWrite(root, file_path): 5 6 rough_string = ET.tostring(root, 'utf-8') 7 reparsed = minidom.parseString(rough_string) 8 new_str = reparsed.toprettyxml(indent="\t") 9 f = open(file_path, 'w', encoding='utf-8') 10 f.write(new_str) 11 f.close() 12 13 root = ET.Element('family', {"age": "18"}) 14 15 # son = ET.Element('family', {"age": "18"}) 16 # son = root.makeelement('family', {"age": "18"}) 17 # root.append(son) 18 ET.SubElement(root,'family', {"age": "19"}) 19 son = ET.SubElement(root,'family', {"age": "十一"}) 20 ET.SubElement(son,'family', {"age": "1"}) 21 22 # tree = ET.ElementTree(root) 23 # tree.write("out.xml", encoding='utf-8', short_empty_elements=False) 24 # tree.write("out.xml", encoding='utf-8', xml_declaration=True) 25 # ET.tostring() 26 27 MyWrite(root, "nnnnn.xml") 28 29 传入 xml对象 和文件
4、命名空间
详细介绍,猛击这里
1 from xml.etree import ElementTree as ET 2 3 ET.register_namespace('com',"http://www.company.com") #some name 4 5 # build a tree structure 6 root = ET.Element("{http://www.company.com}STUFF") 7 body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"}) 8 body.text = "STUFF EVERYWHERE!" 9 10 # wrap it in an ElementTree instance, and save as XML 11 tree = ET.ElementTree(root) 12 13 tree.write("page.xml", 14 xml_declaration=True, 15 encoding='utf-8', 16 method="xml") 17 18 命名空间
练习
1 xml 获取qq是否在线
1 http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=627904863
1 import requests 2 from xml.etree import ElementTree as ET #XML 模块 3 req = requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=1003408567") 4 res = req.text #获取get到的字符串,用.text方法 5 6 #解析xml格式内容 7 #xml接受一个参数:字符串,格式化为特殊的对象 8 node = ET.XML(res) 9 if node.text == "Y": 10 print("在线") 11 elif node.text == "N": 12 print("离线") 13 elif node.text == "V": 14 print("隐身")
2 获取列车时刻表 xml
1 <DataSet xmlns="http://WebXml.com.cn/"> 2 <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="getDetailInfo"> 3 <xs:element name="getDetailInfo" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 4 <xs:complexType> 5 <xs:choice minOccurs="0" maxOccurs="unbounded"> 6 <xs:element name="TrainDetailInfo"> 7 <xs:complexType> 8 <xs:sequence> 9 <xs:element name="TrainStation" type="xs:string" minOccurs="0"/> 10 <xs:element name="ArriveTime" type="xs:string" minOccurs="0"/> 11 <xs:element name="StartTime" type="xs:string" minOccurs="0"/> 12 <xs:element name="KM" type="xs:short" minOccurs="0"/> 13 </xs:sequence> 14 </xs:complexType> 15 </xs:element> 16 </xs:choice> 17 </xs:complexType> 18 </xs:element> 19 </xs:schema> 20 <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 21 <getDetailInfo xmlns=""> 22 <TrainDetailInfo diffgr:id="TrainDetailInfo1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 23 <TrainStation>上海(车次:K234\K235)</TrainStation> 24 <ArriveTime/> 25 <StartTime>11:12:00</StartTime> 26 <KM>0</KM> 27 </TrainDetailInfo> 28 <TrainDetailInfo diffgr:id="TrainDetailInfo2" msdata:rowOrder="1" diffgr:hasChanges="inserted"> 29 <TrainStation>昆山</TrainStation> 30 <ArriveTime>11:45:00</ArriveTime> 31 <StartTime>11:48:00</StartTime> 32 <KM>49</KM> 33 </TrainDetailInfo> 34 <TrainDetailInfo diffgr:id="TrainDetailInfo3" msdata:rowOrder="2" diffgr:hasChanges="inserted"> 35 <TrainStation>苏州</TrainStation> 36 <ArriveTime>12:12:00</ArriveTime> 37 <StartTime>12:16:00</StartTime> 38 <KM>84</KM> 39 </TrainDetailInfo> 40 <TrainDetailInfo diffgr:id="TrainDetailInfo4" msdata:rowOrder="3" diffgr:hasChanges="inserted"> 41 <TrainStation>无锡</TrainStation> 42 <ArriveTime>12:44:00</ArriveTime> 43 <StartTime>12:55:00</StartTime> 44 <KM>126</KM> 45 </TrainDetailInfo> 46 <TrainDetailInfo diffgr:id="TrainDetailInfo5" msdata:rowOrder="4" diffgr:hasChanges="inserted"> 47 <TrainStation>常州</TrainStation> 48 <ArriveTime>13:22:00</ArriveTime> 49 <StartTime>13:26:00</StartTime> 50 <KM>165</KM> 51 </TrainDetailInfo> 52 <TrainDetailInfo diffgr:id="TrainDetailInfo6" msdata:rowOrder="5" diffgr:hasChanges="inserted"> 53 <TrainStation>镇江</TrainStation> 54 <ArriveTime>14:13:00</ArriveTime> 55 <StartTime>14:16:00</StartTime> 56 <KM>237</KM> 57 </TrainDetailInfo> 58 <TrainDetailInfo diffgr:id="TrainDetailInfo7" msdata:rowOrder="6" diffgr:hasChanges="inserted"> 59 <TrainStation>南京</TrainStation> 60 <ArriveTime>15:04:00</ArriveTime> 61 <StartTime>15:16:00</StartTime> 62 <KM>301</KM> 63 </TrainDetailInfo> 64 <TrainDetailInfo diffgr:id="TrainDetailInfo8" msdata:rowOrder="7" diffgr:hasChanges="inserted"> 65 <TrainStation>蚌埠</TrainStation> 66 <ArriveTime>17:27:00</ArriveTime> 67 <StartTime>17:50:00</StartTime> 68 <KM>485</KM> 69 </TrainDetailInfo> 70 <TrainDetailInfo diffgr:id="TrainDetailInfo9" msdata:rowOrder="8" diffgr:hasChanges="inserted"> 71 <TrainStation>徐州</TrainStation> 72 <ArriveTime>19:38:00</ArriveTime> 73 <StartTime>19:58:00</StartTime> 74 <KM>649</KM> 75 </TrainDetailInfo> 76 <TrainDetailInfo diffgr:id="TrainDetailInfo10" msdata:rowOrder="9" diffgr:hasChanges="inserted"> 77 <TrainStation>商丘</TrainStation> 78 <ArriveTime>22:12:00</ArriveTime> 79 <StartTime>22:17:00</StartTime> 80 <KM>795</KM> 81 </TrainDetailInfo> 82 <TrainDetailInfo diffgr:id="TrainDetailInfo11" msdata:rowOrder="10" diffgr:hasChanges="inserted"> 83 <TrainStation>开封</TrainStation> 84 <ArriveTime>23:49:00</ArriveTime> 85 <StartTime>23:53:00</StartTime> 86 <KM>926</KM> 87 </TrainDetailInfo> 88 <TrainDetailInfo diffgr:id="TrainDetailInfo12" msdata:rowOrder="11" diffgr:hasChanges="inserted"> 89 <TrainStation>郑州</TrainStation> 90 <ArriveTime>00:37:00</ArriveTime> 91 <StartTime>01:14:00</StartTime> 92 <KM>998</KM> 93 </TrainDetailInfo> 94 <TrainDetailInfo diffgr:id="TrainDetailInfo13" msdata:rowOrder="12" diffgr:hasChanges="inserted"> 95 <TrainStation>新乡</TrainStation> 96 <ArriveTime>02:20:00</ArriveTime> 97 <StartTime>02:22:00</StartTime> 98 <KM>1078</KM> 99 </TrainDetailInfo> 100 <TrainDetailInfo diffgr:id="TrainDetailInfo14" msdata:rowOrder="13" diffgr:hasChanges="inserted"> 101 <TrainStation>鹤壁</TrainStation> 102 <ArriveTime>03:01:00</ArriveTime> 103 <StartTime>03:03:00</StartTime> 104 <KM>1144</KM> 105 </TrainDetailInfo> 106 <TrainDetailInfo diffgr:id="TrainDetailInfo15" msdata:rowOrder="14" diffgr:hasChanges="inserted"> 107 <TrainStation>安阳</TrainStation> 108 <ArriveTime>03:33:00</ArriveTime> 109 <StartTime>03:36:00</StartTime> 110 <KM>1185</KM> 111 </TrainDetailInfo> 112 <TrainDetailInfo diffgr:id="TrainDetailInfo16" msdata:rowOrder="15" diffgr:hasChanges="inserted"> 113 <TrainStation>邯郸</TrainStation> 114 <ArriveTime>04:11:00</ArriveTime> 115 <StartTime>04:16:00</StartTime> 116 <KM>1245</KM> 117 </TrainDetailInfo> 118 <TrainDetailInfo diffgr:id="TrainDetailInfo17" msdata:rowOrder="16" diffgr:hasChanges="inserted"> 119 <TrainStation>邢台</TrainStation> 120 <ArriveTime>04:47:00</ArriveTime> 121 <StartTime>04:51:00</StartTime> 122 <KM>1297</KM> 123 </TrainDetailInfo> 124 <TrainDetailInfo diffgr:id="TrainDetailInfo18" msdata:rowOrder="17" diffgr:hasChanges="inserted"> 125 <TrainStation>石家庄</TrainStation> 126 <ArriveTime>06:05:00</ArriveTime> 127 <StartTime/> 128 <KM>1406</KM> 129 </TrainDetailInfo> 130 </getDetailInfo> 131 </diffgr:diffgram> 132 </DataSet> 133 134 列车时刻表
1 # 获取 列车时刻表 2 import requests 3 from xml.etree import ElementTree as ET 4 # 使用第三方模块requests 发送HTTP请求,或者XML 格式内容 5 r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=") 6 result = r.text 7 8 # 将 请求的字符串结果 通过xml的模块的方法转换成xml格式 9 ret = ET.XML(result) 10 11 for node in ret.iter("TrainDetailInfo"): # xml的iter是可迭代的 传参是 xml的标签的名 12 # print(node.tag,node.attrib) # tag是标签 13 # if not node.find("StartTime").text: # find 是查找标签内的文本的标签对应的内容 14 # node.find("StartTime").text = "都到站了,管它几点呢,晚点你也得坐啊" 15 print(node.find("TrainStation").text,node.find("StartTime").text) 16 17 完整查看xml列车时刻的代码
1 import requests 2 from xml.etree import ElementTree as ET 3 4 # 使用第三方模块requests发送HTTP请求,或者XML格式内容 5 url="http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=" 6 tr=input("请输入列车号:") 7 url=url+tr+"&UserID=" 8 req = requests.get(url) 9 print(type(req)) 10 res = req.text #获取get到的字符串 11 12 #解析XML格式内容,把字符串解析成xml。 13 root=ET.XML(res) 14 for node in root.iter("TrainDetailInfo"): 15 # print(node.tag,node.attrib) 16 print(node.find("TrainStation").text,node.find("StartTime").text)