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

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

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.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("登陆失败")
View Code

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请求
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请求
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("离线")
View Code

实例:查看火车停靠信息

 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)
View Code

注:更多接口猛击这里

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方式
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创建 二级三级节点
在已有文件获取根节点情况 利用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类的对象 创建一个新文件
利用 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类的对象
已有文件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创建
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 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件
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对象 和文件
传入 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 命名空间
View Code

练习

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 列车时刻表
XML文件
 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)

 

posted @ 2017-03-27 10:01  崔崔0624  阅读(877)  评论(0编辑  收藏  举报
TOP