python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml
模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块,文件或文件夹
- 内置模块
- 开源模块
一 第三方模块安装
- # python 安装第三方模块
- # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+python的scripts路径
- (1) python管理工具 pip
- # python3 -m pip install requests # 3版本安装
- (2) 源码安装
- 解压
- cmd
- 进到你下载的包路径
- python setup.py install #选择你要安装的Python版本。
windows下安装开源模块
报错
- pip install django
- Fatal error in launcher: Unable to create process using '"'
解决方法
- python -m pip install package
- 如果找不到pip命令可以去scripts目录下
- 安装报错
- C:\Python35\Scripts
- λ pyip install django
- Fatal error in launcher: Unable to create process using '"'
- C:\Python35\Scripts
- λ pip install django
- Fatal error in launcher: Unable to create process using '"'
- 解决 python -m pip install package
- C:\Python35\Scripts
- λ python -m pip install requests
- Collecting requests
- Downloading requests-2.10.0-py2.py3-none-any.whl (506kB)
- 100% |████████████████████████████████| 507kB 144kB/s
- Installing collected packages: requests
- Successfully installed requests-2.10.0
- You are using pip version 7.1.2, however version 8.1.2 is available.
- You should consider upgrading via the 'python -m pip install --upgrade pip' command.
- C:\Python35\Scripts
- λ piython -m pip install django
- Collecting django
- Downloading Django-1.9.6-py2.py3-none-any.whl (6.6MB)
- 100% |████████████████████████████████| 6.6MB 64kB/s
- Installing collected packages: django
- Successfully installed django-1.9.6
- You are using pip version 7.1.2, however version 8.1.2 is available.
- You should consider upgrading via the 'python -m pip install --upgrade pip' command.
- C:\Python35\Scripts
- λ python3 -m pip install django
- Collecting django
- Using cached Django-1.9.6-py2.py3-none-any.whl
- Installing collected packages: django
- Successfully installed django-1.9.6
- You are using pip version 7.1.2, however version 8.1.2 is available.
- You should consider upgrading via the 'python -m pip install --upgrade pip' command.
二 自定义模块
也就是自己写的python脚本,而目录就是所谓的包
1 定义模块
2 导入模块
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
- import module
- from module.xx.xx import xx
- from module.xx.xx import xx as rename
- from module.xx.xx import *
2 .2 导入模块后如何调用
- 第一种:
- from lib import account
- ret = account.login() # 导入模块,这里方法调用必须用模块
- print(ret)
- 第二种:
- from lib.account import login #这里如果直接导入方法,需要包.模块
- ret = login()
- print(ret)
- 第三种
- import lib.account #如果是直接import
- ret = lib.account.login() #调用时候需要从头开始写
- print(ret)
- 第四种:
- from lib.account import login as l #as使用
- ret = l()
- print(ret)
- account 文件
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- def login():
- return "login"
- def register():
- return "register"
- def logout():
- return "logout"
3 模块默认查找路径
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path,根据sys.path下的路径去找。
- import sys
- print(sys.path)
- C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/mk.py
- ['E:\\py\\55\\learn-python\\oldboy\\6',
'E:\\py\\55\\learn-python\\oldboy',
'C:\\Python35\\python35.zip',
'C:\\Python35\\DLLs',
'C:\\Python35\\lib',
'C:\\Python35',
'C:\\Python35\\lib\\site-packages']
4 将某个路径加入到环境变量
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
- # 将d盘写的一个脚本加入到sys路径,这样D盘下面的py文件就可以作为模块直接用。
- import sys
- sys.path.append("D:")
- import buy
- ret = buy.fun()
- print(ret)<br><br>
- import sys
- import os
- pre_path = os.path.abspath('../')
- sys.path.append(pre_path)
三 内置模块
1 、os
用于提供系统级别的操作
- os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
- os.curdir 返回当前目录: ('.')
- os.pardir 获取当前目录的父目录字符串名:('..')
- os.makedirs('dirname1/dirname2') 可生成多层递归目录
- os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
- os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ls
- os.remove() 删除一个文件 rm
- os.rename("oldname","newname") 重命名文件/目录
- os.stat('path/filename') 获取文件/目录信息,包含文件大小。
- os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
- os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
- os.pathsep 输出用于分割文件路径的字符串
- os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
- os.system("bash command") 运行shell命令,直接显示,模拟一个人的操作,
- os.environ 获取系统环境变量
- os.path.abspath(path) 返回path规范化的绝对路径
- os.path.split(path) 将path分割成目录和文件名二元组返回
- os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
- os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
- os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
- os.path.isabs(path) 如果path是绝对路径,返回True
- os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
- os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
- os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
- os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
- os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- import os
- print(os.getcwd())
- # 测是 chdir 切换目录,切换到上级目录
- # pwd =os.getcwd()
- # li = pwd.split("\\")
- # del li[-1]
- # pwd='\\'.join(li)
- # print(pwd)
- # os.chdir(pwd)
- # print(os.getcwd())
- print(os.curdir) # 返回.
- a = os.pardir
- print(a) # 返回是..
- # os.makedirs("a/b/c")
- # os.makedirs("a/b") #在本层目录下创建a/b
- # os.removedirs("a/b") # b为空,删除b后,a也为空,则都删除 否则哪级不为空就会报错
- # os.mkdir("b") #创建目录
- # print(os.listdir('a/b')) #列出目录内一层的内容包括隐藏目录
- # os.remove('a/b/圣达菲.py') # 删除b下的文件
- # os.rmdir("b")# 删除空目录 否则报错
- # os.rename("a","b") # 重命名文件或者目录
- # print(os.stat("b")) #获取目录信息
- # print(os.sep) # 输出路径分隔符 linux / windows //
- # print(os.linesep) #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
- # print(os.pathsep) #输出用于分割文件路径的字符串
- # print(os.name) #输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
- # os.system("ip ro") #必须在linux手动执行脚本
- # print(os.environ) #获取环境变量
- # print(os.path.abspath("b")) # # 获取b目录规范化的绝对路径
- # print(os.path.split("b")) #将传入的字符串路径分割成目录和文件名二元数组返回 ('', 'b')
- print(os.path.dirname("a/b")) #获取最后一个目录之前的路径
- print(os.path.exists('/b/c')) #判断是否存在 返回True 或者false
- print(os.path.basename('a/b/c')) #获取最后一层目录
- print(os.path.isabs('a/b/c')) #是否是绝对路径
- print(os.path.isfile('b/sss')) #最后一个名是否是文件 返回True 或者false
- print(os.path.isdir('a/b'))#最后一个名是否是目录 返回True 或者false
- print(os.path.join("a/b/c","b/b")) #a/b/c\b/b
- print(os.path.getatime("a/b/c"))
- print(os.path.getmtime("a/b/c"))
案例:
根据用户输入创建目录
- import os,sys
- dirname = input("input ur dir name:").strip()
- dir_path = os.getcwd() #获取当前脚本所在目录
- new_path = r"%s\%s"%(dir_path,dirname) #拼接输入名与目录路径
- if not os.path.exists(new_path):
- os.mkdir(new_path)
os 模块常用 功能 dirname basename join
这里先介绍 内置函数vars()
每个py文件相当于一个模块,而这个文件的许多方法,可以用print(var())
- print(vars())
- -----------------
- C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py
- {'__name__': '__main__', '__cached__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000226A98E5BE0>, '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, '__file__': 'E:/py/55/learn-python/oldboy/6/module_test2.py', '__package__': None}
__doc__ #py文件开头的注释文字
__file__ #当前py文件的路径
__package__ #包含文件所在包,用 . 分隔,当前文件为None,导入的其他文件:指定文件所在包,用.分隔。
__cached__ #文件的缓存
#当前文件没有,导入的其他文件有缓存
__name__ #如果是主文件,__name__==__main__,否则,等于模块名。用作执行的条件判断。
1、主文件
调用主函数前 ,必须加判断。if __name__==__main__:
2、__file__
当前文件的路径,
返回当前文件的目录
- print(__doc__) # python文件的注释 三引号 注释必须在开头,
- print(__file__) #自身脚本文件加路径
- print(__package__) # 当前文件为None
- from s12_mokuai import s1
- print(s1.__package__) # 导入模块文件的文件: 则输出导入模块文件的所在目录
- #
- # from s12_mokuai import s1
- # print(s1.__cached__) #导入的文件,则输出其缓存目录
- print(__cached__) #没有导入 当前文件的缓存为None,
文件路径及目录,获取文件名等等操作
- import os
- print(__file__)#文件的路径
- print(os.path.dirname(__file__))#返回文件的目录,文件的上层
- print(os.path.dirname(os.path.dirname(__file__)))#上层的上层
- print(os.path.basename(__file__))#返回文件名
- --------------------------
- C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py
- E:/py/55/learn-python/oldboy/6/module_test2.py
- E:/py/55/learn-python/oldboy/6
- E:/py/55/learn-python/oldboy
- module_test2.py
重点1 而 __name__的重要性不言而喻
当我们的程序只有一个入口的时候,如果加入if __name__ == "__main__": 那么我们程序主文件被导入的时候__name__的值是模块的名字,程序主程序是不执行的。
- print(__name__) # 当执行该脚本时候输出为 __main__ 而当被导入的时候是其模块名称
- # 主文件
# 调用主函数前,必须 if __name__ == "__main__":
重点2 __file__ #自身脚本文件加路径
假如当前脚本所在目录还有一个目录,python里面称为包,而这个包下有好多模块,也就是py文件,我们如果想调用,怎么用呢??这就用到os模块的 三个方法basename dirname join 还有我们刚提到的__file__ 还有 sys的path方法
- import os,sys
- print(os.path.dirname(__file__))
- p1 = os.path.dirname(__file__)#返回文件的目录,文件的上层
- p2 = os.path.basename(__file__)#返回文件的文件名
- new_dir = os.path.join(p1,p2)#拼接成路径
- sys.path.append(new_dir)#加入到sys.path
2、sys
用于提供对解释器相关的操作
- sys.argv 命令行参数List,第一个元素是程序本身路径
- sys.exit(n) 退出程序,正常退出时exit(0)
- sys.version 获取Python解释程序的版本信息
- sys.maxint 最大的Int值
- sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
- sys.platform 返回操作系统平台名称
- sys.stdout.write('please:')
- val = sys.stdin.readline()[:-1]
2.1 argv 将文件名和参数做成列表返回
- import sys
- print(sys.argv)
- saltstack_s:/share/py_test/s8 # py s9_argv.py 9 9 9 9
- ['s9_argv.py', '', '', '', '']
sys.stdout.write()
sys.stdout.flush()刷新屏幕缓存io
- #进度条案例
- import time,sys
- for i in range(101):
- #显示进度条百分比 #号从1开始 空格从99递减
- hashes = '#' * int(i / 100.0 * 100)
- spaces = ' ' * (100 - len(hashes))
- sys.stdout.write("\r[%s] %s%%" % (hashes + spaces, i)) #必须两个%%才是,因为一个%是取模,python解释器会默认过滤
- sys.stdout.flush() #强制刷新屏幕缓冲区使其一行输出
- time.sleep(0.05)
- import time
- import sys
- for i in range(30):
- sys.stdout.write('\r')
- sys.stdout.write("%s%%|%s" % (int(i/30*100),int(i/30*100)*"*"))
- sys.stdout.flush()
- time.sleep(0.3)
3 time datatime模块
时间相关的操作,时间有三种表示方式:
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
- print time.time() # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186
- print time.mktime(time.localtime()) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0
- print time.gmtime() #可加时间戳参数 # 结构化UTC时间返回 元组返回 年、日、星期 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=7, tm_min=26, tm_sec=11, tm_wday=1, tm_yday=138, tm_isdst=0)
- print time.localtime() #可加时间戳参数 #结构化计算机本地时间返回 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15, tm_min=31, tm_sec=26, tm_wday=1, tm_yday=138, tm_isdst=0)
- print time.strptime('2014-11-11', '%Y-%m-%d') print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25
- print time.strftime('%Y-%m-%d') #默认当前时间
- print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
- print time.asctime()
- print time.asctime(time.localtime())
- print time.ctime(time.time())
- import datetime
- '''
- datetime.date:表示日期的类。常用的属性有year, month, day
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
- datetime.datetime:表示日期时间
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度
- timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
- strftime("%Y-%m-%d")
- '''
- import datetime
- print datetime.datetime.now()
- print datetime.datetime.now() - datetime.timedelta(days=5)
3.1 time 模块练习
时间戳与日期之间的相互转化
- 当前时间戳:time.time()
- 当前日期:time.ctime()
- 1、Python下日期到时间戳的转换
- import datetime
- import time
- dateC=datetime.datetime(2010,6,6,8,14,59)
- timestamp=time.mktime(dateC.timetuple())
- print timestamp
- 2、Python下将时间戳转换到日期
- import datetime
- import time
- ltime=time.localtime(1395025933)
- timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime)
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- __author__ = 'liujianzuo'
- import time
- """
- 时间相关的操作,时间有三种表示方式:
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:等... time.struct_time 即:time.localtime()
- """
- ################## 时间戳 与 结构化时间 转换 ######################
- print(time.time()) # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186
- print(time.ctime()) # 周 月 日 时间 年 Sat May 21 22:25:28 2016
- print(time.ctime(time.time())) # 转换时间戳 为 Sat May 21 22:25:28 2016
- print(time.ctime(time.time() - 86400)) # 转换时间戳 为 Sat May 21 22:25:28 2016
- print(time.gmtime()) # 结构化UTC时间返回 元组返回 年、日、星期 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=7, tm_min=26, tm_sec=11, tm_wday=1, tm_yday=138, tm_isdst=0)
- obj = time.gmtime()
- print(obj.tm_year) #获取结构化的时间年 2016
- print(time.localtime()) #结构化计算机本地时间返回 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15, tm_min=31, tm_sec=26, tm_wday=1, tm_yday=138, tm_isdst=0)
- #结构化时间 转换 时间戳
- print(time.mktime(time.localtime())) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0
- ################## ################## ################## ##################
- ################## 结构化时间 与 字符串时间转换 ######################
- #将结构化的对象时间转换为字符串 trftime 即:time.struct_time(tm_year=2016, tm_mon=5,。。。) ===转换为=》 ”%Y-%m-%d %H:%M %s# “
- print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25
- #将字符串日期 转换为 时间结构对象 strptime ”%Y-%m-%d %H:%M %s# “ ===转换为=》 time.struct_time(tm_year=2016, tm_mon=5,。。。)
- print(time.strptime("2016-09-10 10:11","%Y-%m-%d %H:%M")) # time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15,
- ################## ################## ################## ##################
3.2 datetime 模块练习
- import datetime
- '''
- datetime.date:表示日期的类。常用的属性有year, month, day
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
- datetime.datetime:表示日期时间
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度
- timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
- strftime("%Y-%m-%d")
- '''
- import datetime
- print datetime.datetime.now()
- print datetime.datetime.now() - datetime.timedelta(days=5)
- # -*- coding: utf-8 -*-
- #datetime类
- #datetime是date与time的结合体,包括date与time的所有信息。
- #它的构造函数如下:
- #datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
- #各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。
- # 1. datetime类定义的类属性与方法:
- #datetime.min、datetime.max:datetime所能表示的最小值与最大值;
- #print: datetime.max: 9999-12-31 23:59:59.999999
- #print: datetime.min: 0001-01-01 00:00:00
- from datetime import *
- import time
- print 'datetime.max:' , datetime.max
- print 'datetime.min:' , datetime.min
- #datetime.resolution:datetime最小单位;
- #print: datetime.resolution: 0:00:00.000001
- print 'datetime.resolution:' , datetime.resolution
- #datetime.today():返回一个表示当前本地时间的datetime对象;
- #print: today(): 2012-09-12 19:37:50.721000
- print 'today():' , datetime.today()
- #datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
- #print: now(): 2012-09-12 19:37:50.738000
- print 'now():' , datetime.now()
- #datetime.utcnow():返回一个当前utc时间的datetime对象;
- #print: 2012-09-12 11:37:50.739000
- print 'utcnow():' , datetime.utcnow()
- #datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
- #print: fromtimestamp(tmstmp): 2012-09-12 19:37:50.741000
- print 'fromtimestamp(tmstmp):' , datetime.fromtimestamp(time.time())
- #datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
- #print: utcfromtimestamp(tmstmp): 2012-09-12 11:37:50.742000
- print 'utcfromtimestamp(tmstmp):' , datetime.utcfromtimestamp(time.time())
- #datetime.combine(date, time):根据date和time,创建一个datetime对象;
- #print: datetime.combine(date,time): 2012-09-12 19:46:05
- d = date(2012,9,12)
- from datetime import *
- t = time(19,46,5)
- print 'datetime.combine(date,time): ',datetime.combine(d,t)
- #datetime.strptime(date_string, format):将格式字符串转换为datetime对象;
- #print: 2007-03-04 21:08:12
- print datetime.strptime("2007-03-04 21:08:12", "%Y-%m-%d %H:%M:%S")
- #2. datetime类提供的实例方法与属性
- dt = datetime.strptime("2012-09-12 21:08:12", "%Y-%m-%d %H:%M:%S")
- #print: 2012 9 12 21 8 12 0 None
- print dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo
- print dt.date()
- print dt.time()
- print dt.replace(year = 2013)
- print dt.timetuple()
- print dt.utctimetuple()
- print dt.toordinal()
- print dt.weekday()
- print dt.isocalendar()
- #print dt.isoformat([sep])
- #datetime. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
- #3. 格式字符串
- # datetime. strftime (format)
- # %a 星期的简写。如 星期三为Web
- # %A 星期的全写。如 星期三为Wednesday
- # %b 月份的简写。如4月份为Apr
- # %B月份的全写。如4月份为April
- # %c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
- # %d: 日在这个月中的天数(是这个月的第几天)
- # %f: 微秒(范围[0,999999])
- # %H: 小时(24小时制,[0, 23])
- # %I: 小时(12小时制,[0, 11])
- # %j: 日在年中的天数 [001,366](是当年的第几天)
- # %m: 月份([01,12])
- # %M: 分钟([00,59])
- # %p: AM或者PM
- # %S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
- # %U: 周在当年的周数当年的第几周),星期天作为周的第一天
- # %w: 今天在这周的天数,范围为[0, 6],6表示星期天
- # %W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
- # %x: 日期字符串(如:04/07/10)
- # %X: 时间字符串(如:10:43:39)
- # %y: 2个数字表示的年份
- # %Y: 4个数字表示的年份
- # %z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
- # %Z: 时区名称(如果是本地时间,返回空字符串)
- # %%: %% => %
- dt = datetime.now()
- #print: (%Y-%m-%d %H:%M:%S %f): 2012-09-12 23:04:27 145000
- print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f')
- #print: (%Y-%m-%d %H:%M:%S %p): 12-09-12 11:04:27 PM
- print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p')
- #print: %a: Wed
- print '%%a: %s ' % dt.strftime('%a')
- #print: %A: Wednesday
- print '%%A: %s ' % dt.strftime('%A')
- #print: %b: Sep
- print '%%b: %s ' % dt.strftime('%b')
- #print: %B: September
- print '%%B: %s ' % dt.strftime('%B')
- #print: 日期时间%c: 09/12/12 23:04:27
- print '日期时间%%c: %s ' % dt.strftime('%c')
- #print: 日期%x:09/12/12
- print '日期%%x:%s ' % dt.strftime('%x')
- #print: 时间%X:23:04:27
- print '时间%%X:%s ' % dt.strftime('%X')
- #print: 今天是这周的第3天
- print '今天是这周的第%s天 ' % dt.strftime('%w')
- #print: 今天是今年的第256天
- print '今天是今年的第%s天 ' % dt.strftime('%j')
- #print: 今周是今年的第37周
- print '今周是今年的第%s周 ' % dt.strftime('%U')
4 hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
- import hashlib
- # ######## md5 ########
- hash = hashlib.md5()
- hash.update(bytes("admin",encoding="utf-8"))
- print(hash.hexdigest())
- # ######## sha1 ########
- hash = hashlib.sha1()
- hash.update(bytes("admin",encoding="utf-8"))
- print(hash.hexdigest())
- # ######## sha256 ########
- hash = hashlib.sha256()
- hash.update(bytes("admin",encoding="utf-8"))
- print(hash.hexdigest())
- # ######## sha384 ########
- hash = hashlib.sha384()
- hash.update(bytes("admin",encoding="utf-8"))
- print(hash.hexdigest())
- # ######## sha512 ########
- hash = hashlib.sha512()
- hash.update(bytes("admin",encoding="utf-8"))
- print(hash.hexdigest())
加盐
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
- ######## md5 加盐########
- hash = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8"))
- hash.update(bytes("admin",encoding="utf-8"))
- print(hash.hexdigest())
- obj = hashlib.md5(bytes("salt;%#%salt", encoding="utf-8")) # 这里是输入的盐值 ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
- print(obj) # <md5 HASH object @ 0x0000000000A1F800>
- obj.update(bytes("mypasswd123", encoding="utf-8")) # 更新哈希对象以字符串参数 其实就是你的明文密码
- print(obj.digest()) ##返回摘要,作为二进制数据字符串值 b'\x04\x80)\x17\\\xf8dPA\xbc\xd9@e\xeb&\x0f'
- print(obj.hexdigest()) # 返回十六进制数字字符串 048029175cf8645041bcd94065eb260f
HMAC加密:
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
消息认证算法:MAC (Message Authentication Codes) 消息认证码
- import hmac
- h = hmac.new('wupeiqi')
- h.update('hellowo')
- print h.hexdigest()
- 对称加密:
- 加密算法 + 口令
- 明文 --> 密文
- 字典攻击
- 20位:100^20=10^32
- 加密方,解密方使用同一个口令
- 加密算法:
- DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des
- AES:128位 高级加密标准
- 3DES:3次加密后的
- 加密方,解密方使用同一个口令
- DES(56bits), 3DES, AES(128bits), Blowfish
- Twofish, IDEA, RC6, CAST5, Serpent
- block
- 特性:1、加密/解密使用同一口令
- 2、将原文分割成固定大小的数据块,对这些进行加密
- ECB, CBC
- 密钥交换(IKE: Internet Key Exchange):DH算法 发明者两个人的名字首字母
- 非对称加密: :本地生成一对钥匙,公钥私钥,公钥是可以公开的,私钥是自己的。跟别人通信,就把对方的公钥要过来,加密完,只有对方才能解开。
- 由于加密太长,所以不用来加密数据。用对称密码加密数据,用非对称密码的钥匙加密身份
- 加密算法:RSA, EIGamal, DSA
- 1、密钥交换
- 2、身份认证
- 单向加密:
- 抽取数据特征码:
- MD5, SHA1, SHA512, CRC-32(循环冗余校验码)
- 1、完整性
- 消息认证算法:MAC (Message Authentication Codes) 消息认证码
- CBC-MAC
- HMAC:
- 雪崩效应:
- 定长输入:
- 数据加密: 抽取数据特征码用单向加密,再用非对称加密特征码,加在数据前面,然后在用对称加密,然后再用对方的公钥加密数据。发送出去。
加密介绍
注册 登陆案例
- import hashlib
- def md5(args):
- hs=hashlib.md5()
- hs.update(bytes(args,encoding="utf-8"))
- return hs.hexdigest()
- def register(us,pw):
- with open("db","a",encoding="utf-8") as f:
- temp=us+"|"+md5(pw)+"\n"
- f.write(temp)
- def login(us,pw):
- with open("db","r",encoding="utf-8") as f:
- for i in f:
- u,p=i.strip().split("|")
- if u==us and md5(pw)==p:
- return True
- ch=int(input("1.登陆\n2.注册"))
- if ch==2:
- user=input("用户名:")
- pwd=input("密码:")
- register(user,pwd)
- if ch==1:
- user = input("用户名:")
- pwd = input("密码:")
- r=login(user,pwd)
- if r:
- print("登陆成功")
- else:
- print("登陆失败")
5 pickle 序列化 (等同json)
Python中用于序列化的两个模块
- json 用于【字符串】和 【python基本数据类型】 间进行转换
- pickle 用于【python特有的类型】 和 【python基本数据类型】间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
load loads dumps dump 区别
我们看一下 pickle 接口。 pickle 模块提供了以下函数对: dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象; loads(string) 返回包含在 pickle 字符串中的对象; dump(object, file) 将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数; load(file) 返回包含在 pickle 文件中的对象。
dumps dump 区别 存入文件
- accounts = {
1000: {
'name': 'Alex LI',
'email': 'lijie3721@126.com',
'passwd': 'abc123',
'balance': 15000,
'phone': 13651054608,
'bank_acc': {
'ICBC': 14324234,
'CBC': 235234,
'ABC': 35235423
}
},
1001: {
'name': 'CaiXin Guo',
'email': 'caixin@126.com',
'passwd': 'abc145323',
'balance': -15000,
'phone': 1345635345,
'bank_acc': {
'ICBC': 4334343,
}
},
}- import pickle
- # dumps 直接传存储对象,也就是先转成制服穿在传进文件
# f = open("pickle_test.db", "wb")
# f.write(pickle.dumps(accounts))
# f.close()
#dump除了传存储对象还有打开的文件句柄,同事完成
f = open("pickle_test2.db", "wb")
pickle.dump(accounts, f)
f.close()
load loads 区别 这里注意文件指针 一次read 就到结尾
- import pickle
- # f = open("pickle_test.db", "rb")
#
# acc = pickle.loads(f.read())
# f.close()
# print(acc,type(acc))
f = open("pickle_test2.db", "rb")
acc_load = pickle.load(f)
print(acc_load)
加载到内存修改后再存入文件
- import pickle
- f = open("account.db","rb")
- acc = pickle.loads(f.read())
- f.close()
- acc[1000]['balance'] -=500
- f = open("account.db","wb")
- f.write(pickle.dumps(acc))
- f.close()
- f = open("account.db","rb")
- acc = pickle.loads(f.read())
- print(acc)
- f.close()
6 json 序列化
首先我们应该知道,python的一些不是通用的数据类型json是不能序列话的,比如时间戳等
loads 方法 将传过来的字符串(长得像python的字典或者列表数据类型)序列化成字典或列表
注意其调用的对象内部必须是双引号,json不识别单引号,而且,整个字符串必须被单引号或者三个引号引起来,否则报错
- import json
- # s = "{'data':'invilad','status':'1000'}" # json 认为里面必须是双引号才会处理,否则会报错,这样会报错
- s1='{"data":"invilad","status":"1000"}' # json 认为里面必须是双引号才会处理,否则会报错,不会报错
- s2="""{"data":"invilad","status":"1000"}""" # json 认为里面必须是双引号才会处理,否则会报错,不会报错
- l = "[1,2,3]"
- # ret = json.loads(s) # loads 将形似python数据类型列表或字典的字符串转换成 列表或者字典
- ret2=json.loads(s1)
- ret3=json.loads(s2)
- # print(ret, type(ret))
- print(ret2,type(ret2))
- print(ret3,type(ret3))
dumps 方法 将python数据类型列表或字典转换成形似列表或者字典的字符串
- n = {'status': '', 'data': 'invilad'}
- m = [1, 2, 3]
- ret1 = json.dumps(n) # dumps 将python数据类型列表或字典转换成形似列表或者字典的字符串
- print(ret1,type(ret1)) # {"data": "invilad", "status": "1000"} <class 'str'>
- ret1 = json.dumps(m)
- print(ret1,type(ret1)) # [1, 2, 3] <class 'str'>
dump 和load 的用法
- n = {'status': '', 'data': 'invilad'}
- m = [1, 2, 3]
- # json.dump(n,open("json_test",'w'))# dump 功能就是 先转换为字符串,再写入文件
- r = json.load(open("json_test",'r'))# load 功能就是 读取文件字符串 并转化为python数据类型
- print(r,type(r))
知识点2 :我们接收的网页请求过来是字符串或者字节
- from urllib import request
- f = request.urlopen("http://www.cnblogs.com/") #获取网站内容,作为对象
- # f = request.urlopen("http://yujuanfudan.blog.163.com/")
- ret = f.read() #对象的read方法读出来,和文件类似
- print(type(ret)) #初始是bytes类型
- print(str(ret, encoding="utf-8")) #转成字符串类型
7 requests 第三方模块
Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
发送GET请求
- import urllib.request
- f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
- result = f.read().decode('utf-8')
- print(result)
发送携带请求头的GET请求
- import urllib.request
- req = urllib.request.Request('http://www.example.com/')
- req.add_header('Referer', 'http://www.python.org/')
- r = urllib.request.urlopen(req)
- result = f.read().decode('utf-8')
注:更多见Python官方文档:https://docs.python.org/3.5/library/urllib.request.html#module-urllib.request
request模块
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
1、安装模块
- pip3 install requests
2、使用模块
- import requests,json
- res=requests.get("http://www.weather.com.cn/adat/sk/101010500.html")
- res.encoding="utf-8"
- result=res.text #通过text拿到一个字符串
- print(result,type(result))
- dic=json.loads(result) #通过json.loads转化成字典
- print(dic,type(dic))
- # 1、无参数实例
- import requests
- ret = requests.get('https://github.com/timeline.json')
- print(ret.url)
- print(ret.text)
- # 2、有参数实例
- import requests
- payload = {'key1': 'value1', 'key2': 'value2'}
- ret = requests.get("http://httpbin.org/get", params=payload)
- print(ret.url)
- print(ret.text)
- GET请求
GET请求
- # 1、基本POST实例
- import requests
- payload = {'key1': 'value1', 'key2': 'value2'}
- ret = requests.post("http://httpbin.org/post", data=payload)
- print(ret.text)
- # 2、发送请求头和数据实例
- import requests
- import json
- url = 'https://api.github.com/some/endpoint'
- payload = {'some': 'data'}
- headers = {'content-type': 'application/json'}
- ret = requests.post(url, data=json.dumps(payload), headers=headers)
- print(ret.text)
- print(ret.cookies)
- POST请求
POST请求
- requests.get(url, params=None, **kwargs)
- requests.post(url, data=None, json=None, **kwargs)
- requests.put(url, data=None, **kwargs)
- requests.head(url, **kwargs)
- requests.delete(url, **kwargs)
- requests.patch(url, data=None, **kwargs)
- requests.options(url, **kwargs)
- # 以上方法均是在此方法的基础上构建
- requests.request(method, url, **kwargs)
- 其他请求
其他请求
更多requests模块相关的文档见:http://cn.python-requests.org/zh_CN/latest/
3、Http请求和XML实例
实例:检测QQ账号是否在线
- import urllib
- import requests
- from xml.etree import ElementTree as ET
- # 使用内置模块urllib发送HTTP请求,或者XML格式内容
- """
- f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
- result = f.read().decode('utf-8')
- """
- # 使用第三方模块requests发送HTTP请求,或者XML格式内容
- r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
- result = r.text
- # 解析XML格式内容
- node = ET.XML(result)
- # 获取内容
- if node.text == "Y":
- print("在线")
- else:
- print("离线")
实例:查看火车停靠信息
- import urllib
- import requests
- from xml.etree import ElementTree as ET
- # 使用内置模块urllib发送HTTP请求,或者XML格式内容
- """
- f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
- result = f.read().decode('utf-8')
- """
- # 使用第三方模块requests发送HTTP请求,或者XML格式内容
- r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
- result = r.text
- # 解析XML格式内容
- root = ET.XML(result)
- for node in root.iter('TrainDetailInfo'):
- print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)
注:更多接口猛击这里
8 xml模块
安装requests 模块
查看天气状况
- import requests,json
- res=requests.get("http://www.weather.com.cn/adat/sk/101010500.html")
- res.encoding="utf-8"
- result=res.text #通过text拿到一个字符串
- print(result,type(result))
- dic=json.loads(result) #通过json.loads转化成字典
- print(dic,type(dic))
xml 讲解:
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:
first.xml
- <data>
- <country name="Liechtenstein">
- <rank updated="yes">2</rank>
- <year>2023</year>
- <gdppc>141100</gdppc>
- <neighbor direction="E" name="Austria" />
- <neighbor direction="W" name="Switzerland" />
- </country>
- <country name="Singapore">
- <rank updated="yes">5</rank>
- <year>2026</year>
- <gdppc>59900</gdppc>
- <neighbor direction="N" name="Malaysia" />
- </country>
- <country name="Panama">
- <rank updated="yes">69</rank>
- <year>2026</year>
- <gdppc>13600</gdppc>
- <neighbor direction="W" name="Costa Rica" />
- <neighbor direction="E" name="Colombia" />
- </country>
- </data>
- # 第一种,这种修改不了xml文件的内容
- # 循环获取多级节点 标签
- import requests
- from xml.etree import ElementTree as ET
- # f = open("first.xml","r",encoding="utf-8")
- # ret = ET.XML(f.read())
- #
- # for node in ret:
- # print(node.find("rank").text) # find的查找值一定要是 有text的内容的标签
- #
- # # for node_node in node:
- # for node__ in node_node:
- # print(node__.find("rank"))
- # for node in ret.iter("country"):
- # print(node.find("year").text)
- 课上代码
1、解析XML
利用ElementTree.XML将字符串解析成xml对象
- from xml.etree import ElementTree as ET
- # 打开文件,读取XML内容
- str_xml = open('xo.xml', 'r').read()
- # 将字符串解析成xml特殊对象,root代指xml文件的根节点
- root = ET.XML(str_xml)
- 利用ElementTree.XML将字符串解析成xml对象
#利用ElementTree.parse将文件直接解析成xml对象
- from xml.etree import ElementTree as ET
- # 直接解析xml文件
- tree = ET.parse("xo.xml")
- # 获取xml文件的根节点
- root = tree.getroot()
- #利用ElementTree.parse将文件直接解析成xml对象
xml解析和保存的方式
- # 解析xml
- # 1 接口url 请求get获得的字符串类型 XML
- # import requests
- # from xml.etree import ElementTree as ET
- # r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=")
- # result = r.text
- # # 将 请求的字符串结果 通过xml的模块的方法转换成xml格式
- # ret = ET.XML(result)
- # ==============分隔符====如下是文件句柄 读取的字符串
- # from xml.etree import ElementTree as ET
- # f = open("first.xml","r",encoding="utf-8")
- # ret = ET.XML(f.read())
- #
- # 对于 上面的这种 是Element对象,而不是ElementTree对象,因此不能够write到文件,但是
- #我们可以 先创建ElementTree对象
- # tree = ElementTree(ret) #将ret这个Element对象对应的内存的xml字符串 传给ElementTree类 做成ElementTree对象
- # tree.write("new.xml")
- # 2 文件类型的xml文档 parse
- #from xml.etree import ElementTree as ET
- # n = ET.parse("first.xml")
- #
- # ret = n.getroot() # getroot方法拿到根节点
- # son = ET.Element("Biaoqian2",{"key":"value"})
- # son.text="zhi"
- # ele1 = ET.Element("qq",key2="value2", )
- # ele1.text="woshizhi"
- # ret.append(son)
- # son.append(ele1)
- # n.write("out2.xml")
- xml解析和保存的方式
2、操作XML
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
- class Element:
- """An XML element.
- This class is the reference implementation of the Element interface.
- An element's length is its number of subelements. That means if you
- want to check if an element is truly empty, you should check BOTH
- its length AND its text attribute.
- The element tag, attribute names, and attribute values can be either
- bytes or strings.
- *tag* is the element name. *attrib* is an optional dictionary containing
- element attributes. *extra* are additional element attributes given as
- keyword arguments.
- Example form:
- <tag attrib>text<child/>...</tag>tail
- """
- 当前节点的标签名
- tag = None
- """The element's name."""
- 当前节点的属性
- attrib = None
- """Dictionary of the element's attributes."""
- 当前节点的内容
- text = None
- """
- Text before first subelement. This is either a string or the value None.
- Note that if there is no text, this attribute may be either
- None or the empty string, depending on the parser.
- """
- tail = None
- """
- Text after this element's end tag, but before the next sibling element's
- start tag. This is either a string or the value None. Note that if there
- was no text, this attribute may be either None or an empty string,
- depending on the parser.
- """
- def __init__(self, tag, attrib={}, **extra):
- if not isinstance(attrib, dict):
- raise TypeError("attrib must be dict, not %s" % (
- attrib.__class__.__name__,))
- attrib = attrib.copy()
- attrib.update(extra)
- self.tag = tag
- self.attrib = attrib
- self._children = []
- def __repr__(self):
- return "<%s %r at %#x>" % (self.__class__.__name__, self.tag, id(self))
- def makeelement(self, tag, attrib):
- 创建一个新节点
- """Create a new element with the same type.
- *tag* is a string containing the element name.
- *attrib* is a dictionary containing the element attributes.
- Do not call this method, use the SubElement factory function instead.
- """
- return self.__class__(tag, attrib)
- def copy(self):
- """Return copy of current element.
- This creates a shallow copy. Subelements will be shared with the
- original tree.
- """
- elem = self.makeelement(self.tag, self.attrib)
- elem.text = self.text
- elem.tail = self.tail
- elem[:] = self
- return elem
- def __len__(self):
- return len(self._children)
- def __bool__(self):
- warnings.warn(
- "The behavior of this method will change in future versions. "
- "Use specific 'len(elem)' or 'elem is not None' test instead.",
- FutureWarning, stacklevel=2
- )
- return len(self._children) != 0 # emulate old behaviour, for now
- def __getitem__(self, index):
- return self._children[index]
- def __setitem__(self, index, element):
- # if isinstance(index, slice):
- # for elt in element:
- # assert iselement(elt)
- # else:
- # assert iselement(element)
- self._children[index] = element
- def __delitem__(self, index):
- del self._children[index]
- def append(self, subelement):
- 为当前节点追加一个子节点
- """Add *subelement* to the end of this element.
- The new element will appear in document order after the last existing
- subelement (or directly after the text, if it's the first subelement),
- but before the end tag for this element.
- """
- self._assert_is_element(subelement)
- self._children.append(subelement)
- def extend(self, elements):
- 为当前节点扩展 n 个子节点
- """Append subelements from a sequence.
- *elements* is a sequence with zero or more elements.
- """
- for element in elements:
- self._assert_is_element(element)
- self._children.extend(elements)
- def insert(self, index, subelement):
- 在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置
- """Insert *subelement* at position *index*."""
- self._assert_is_element(subelement)
- self._children.insert(index, subelement)
- def _assert_is_element(self, e):
- # Need to refer to the actual Python implementation, not the
- # shadowing C implementation.
- if not isinstance(e, _Element_Py):
- raise TypeError('expected an Element, not %s' % type(e).__name__)
- def remove(self, subelement):
- 在当前节点在子节点中删除某个节点
- """Remove matching subelement.
- Unlike the find methods, this method compares elements based on
- identity, NOT ON tag value or contents. To remove subelements by
- other means, the easiest way is to use a list comprehension to
- select what elements to keep, and then use slice assignment to update
- the parent element.
- ValueError is raised if a matching element could not be found.
- """
- # assert iselement(element)
- self._children.remove(subelement)
- def getchildren(self):
- 获取所有的子节点(废弃)
- """(Deprecated) Return all subelements.
- Elements are returned in document order.
- """
- warnings.warn(
- "This method will be removed in future versions. "
- "Use 'list(elem)' or iteration over elem instead.",
- DeprecationWarning, stacklevel=2
- )
- return self._children
- def find(self, path, namespaces=None):
- 获取第一个寻找到的子节点
- """Find first matching element by tag name or path.
- *path* is a string having either an element tag or an XPath,
- *namespaces* is an optional mapping from namespace prefix to full name.
- Return the first matching element, or None if no element was found.
- """
- return ElementPath.find(self, path, namespaces)
- def findtext(self, path, default=None, namespaces=None):
- 获取第一个寻找到的子节点的内容
- """Find text for first matching element by tag name or path.
- *path* is a string having either an element tag or an XPath,
- *default* is the value to return if the element was not found,
- *namespaces* is an optional mapping from namespace prefix to full name.
- Return text content of first matching element, or default value if
- none was found. Note that if an element is found having no text
- content, the empty string is returned.
- """
- return ElementPath.findtext(self, path, default, namespaces)
- def findall(self, path, namespaces=None):
- 获取所有的子节点
- """Find all matching subelements by tag name or path.
- *path* is a string having either an element tag or an XPath,
- *namespaces* is an optional mapping from namespace prefix to full name.
- Returns list containing all matching elements in document order.
- """
- return ElementPath.findall(self, path, namespaces)
- def iterfind(self, path, namespaces=None):
- 获取所有指定的节点,并创建一个迭代器(可以被for循环)
- """Find all matching subelements by tag name or path.
- *path* is a string having either an element tag or an XPath,
- *namespaces* is an optional mapping from namespace prefix to full name.
- Return an iterable yielding all matching elements in document order.
- """
- return ElementPath.iterfind(self, path, namespaces)
- def clear(self):
- 清空节点
- """Reset element.
- This function removes all subelements, clears all attributes, and sets
- the text and tail attributes to None.
- """
- self.attrib.clear()
- self._children = []
- self.text = self.tail = None
- def get(self, key, default=None):
- 获取当前节点的属性值
- """Get element attribute.
- Equivalent to attrib.get, but some implementations may handle this a
- bit more efficiently. *key* is what attribute to look for, and
- *default* is what to return if the attribute was not found.
- Returns a string containing the attribute value, or the default if
- attribute was not found.
- """
- return self.attrib.get(key, default)
- def set(self, key, value):
- 为当前节点设置属性值
- """Set element attribute.
- Equivalent to attrib[key] = value, but some implementations may handle
- this a bit more efficiently. *key* is what attribute to set, and
- *value* is the attribute value to set it to.
- """
- self.attrib[key] = value
- def keys(self):
- 获取当前节点的所有属性的 key
- """Get list of attribute names.
- Names are returned in an arbitrary order, just like an ordinary
- Python dict. Equivalent to attrib.keys()
- """
- return self.attrib.keys()
- def items(self):
- 获取当前节点的所有属性值,每个属性都是一个键值对
- """Get element attributes as a sequence.
- The attributes are returned in arbitrary order. Equivalent to
- attrib.items().
- Return a list of (name, value) tuples.
- """
- return self.attrib.items()
- def iter(self, tag=None):
- 在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。
- """Create tree iterator.
- The iterator loops over the element and all subelements in document
- order, returning all elements with a matching tag.
- If the tree structure is modified during iteration, new or removed
- elements may or may not be included. To get a stable set, use the
- list() function on the iterator, and loop over the resulting list.
- *tag* is what tags to look for (default is to return all elements)
- Return an iterator containing all the matching elements.
- """
- if tag == "*":
- tag = None
- if tag is None or self.tag == tag:
- yield self
- for e in self._children:
- yield from e.iter(tag)
- # compatibility
- def getiterator(self, tag=None):
- # Change for a DeprecationWarning in 1.4
- warnings.warn(
- "This method will be removed in future versions. "
- "Use 'elem.iter()' or 'list(elem.iter())' instead.",
- PendingDeprecationWarning, stacklevel=2
- )
- return list(self.iter(tag))
- def itertext(self):
- 在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。
- """Create text iterator.
- The iterator loops over the element and all subelements in document
- order, returning all inner text.
- """
- tag = self.tag
- if not isinstance(tag, str) and tag is not None:
- return
- if self.text:
- yield self.text
- for e in self:
- yield from e.itertext()
- if e.tail:
- yield e.tail
- 节点功能一览表
由于 每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),so 可以利用以上方法进行操作xml文件。
解析文件方法
1 先open文件获得文件句柄 ,然后通过ElementTree.XML方法
2 ElementTree.parse(file_name)
a. 遍历XML文档的所有内容
- from xml.etree import ElementTree as ET
- ############ 解析方式一 ############
- """
- # 打开文件,读取XML内容
- str_xml = open('xo.xml', 'r').read()
- # 将字符串解析成xml特殊对象,root代指xml文件的根节点
- root = ET.XML(str_xml)
- """
- ############ 解析方式二 ############
- # 直接解析xml文件
- tree = ET.parse("xo.xml")
- # 获取xml文件的根节点
- root = tree.getroot()
- ### 操作
- # 顶层标签
- print(root.tag)
- # 遍历XML文档的第二层
- for child in root:
- # 第二层节点的标签名称和标签属性
- print(child.tag, child.attrib)
- # 遍历XML文档的第三层
- for i in child:
- # 第二层节点的标签名称和内容
- print(i.tag,i.text)
b、遍历XML中指定的节点
- from xml.etree import ElementTree as ET
- ############ 解析方式一 ############
- """
- # 打开文件,读取XML内容
- str_xml = open('xo.xml', 'r').read()
- # 将字符串解析成xml特殊对象,root代指xml文件的根节点
- root = ET.XML(str_xml)
- """
- ############ 解析方式二 ############
- # 直接解析xml文件
- tree = ET.parse("xo.xml")
- # 获取xml文件的根节点
- root = tree.getroot()
- ### 操作
- # 顶层标签
- print(root.tag)
- # 遍历XML中所有的year节点
- for node in root.iter('year'):
- # 节点的标签名称和内容
- print(node.tag, node.text)
c、修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。
1 解析字符串方式,修改,保存
以open文件句柄方式打开文件并解析的文件,要最后生成ElementTree对象才能write
- from xml.etree import ElementTree as ET
- ############ 解析方式一 ############
- # 打开文件,读取XML内容
- str_xml = open('xo.xml', 'r').read()
- # 将字符串解析成xml特殊对象,root代指xml文件的根节点
- root = ET.XML(str_xml)
- ############ 操作 ############
- # 顶层标签
- print(root.tag)
- # 循环所有的year节点
- for node in root.iter('year'):
- # 将year节点中的内容自增一
- new_year = int(node.text) + 1
- node.text = str(new_year)
- # 设置属性
- node.set('name', 'alex')
- node.set('age', '')
- # 删除属性
- del node.attrib['name']
- ############ 保存文件 ############
- 因为root是ElementTree.Element对象,没有write方法,只有ElementTree有write方法,可以将root对应的内存地址内容传给ElementTree,实例化成ElementTree对象,就有write方法了
- tree = ET.ElementTree(root)
- tree.write("newnew.xml", encoding='utf-8') #如果更改内容有中文就需要指定编码了
2 解析文件方式,修改,保存
而以parse打开的文件,就是ElementTree对象,就有write方法
- from xml.etree import ElementTree as ET
- ############ 解析方式二 ############
- # 直接解析xml文件
- tree = ET.parse("xo.xml")
- # 获取xml文件的根节点
- root = tree.getroot()
- ############ 操作 ############
- # 顶层标签
- print(root.tag)
- # 循环所有的year节点
- for node in root.iter('year'):
- # 将year节点中的内容自增一
- new_year = int(node.text) + 1
- node.text = str(new_year)
- # 设置属性
- node.set('name', 'alex')
- node.set('age', '')
- # 删除属性
- del node.attrib['name']
- ############ 保存文件 ############
- tree.write("newnew.xml", encoding='utf-8')
d、删除节点
1 解析字符串方式打开,删除,保存
Element对象的remove方法 以 open方式打开如何保存
- from xml.etree import ElementTree as ET
- ############ 解析字符串方式打开 ############
- # 打开文件,读取XML内容
- str_xml = open('xo.xml', 'r').read()
- # 将字符串解析成xml特殊对象,root代指xml文件的根节点
- root = ET.XML(str_xml)
- ############ 操作 ############
- # 顶层标签
- print(root.tag)
- # 遍历data下的所有country节点
- for country in root.findall('country'):
- # 获取每一个country节点下rank节点的内容
- rank = int(country.find('rank').text)
- if rank > 50:
- # 删除指定country节点
- root.remove(country)
- ############ 保存文件 ############
- tree = ET.ElementTree(root)
- tree.write("newnew.xml", encoding='utf-8')
- Element对象的remove方法 以 open方式打开如何保存
2 解析文件方式打开,删除,保存
Element对象 remove 方法 以parse方法打开xml文件保存方法
- from xml.etree import ElementTree as ET
- ############ 解析文件方式 ############
- # 直接解析xml文件
- tree = ET.parse("xo.xml")
- # 获取xml文件的根节点
- root = tree.getroot()
- ############ 操作 ############
- # 顶层标签
- print(root.tag)
- # 遍历data下的所有country节点
- for country in root.findall('country'):
- # 获取每一个country节点下rank节点的内容
- rank = int(country.find('rank').text)
- if rank > 50:
- # 删除指定country节点
- root.remove(country)
- ############ 保存文件 ############
- tree.write("newnew.xml", encoding='utf-8')
- Element对象 remove 方法 以parse方法打开xml文件保存方法
3、创建XML文档
类型str 等类 创建字符串有两种方式生成 a = 'name' a = str("name")
创建方式(一) 类 Element(标签,{属性:值})
- from xml.etree import ElementTree as ET
- # 创建根节点
- root = ET.Element("famliy")
- # 创建节点大儿子
- son1 = ET.Element('son', {'name': '儿1'})
- # 创建小儿子
- son2 = ET.Element('son', {"name": '儿2'})
- # 在大儿子中创建两个孙子
- grandson1 = ET.Element('grandson', {'name': '儿11'})
- grandson2 = ET.Element('grandson', {'name': '儿12'})
- son1.append(grandson1)
- son1.append(grandson2)
- # 把儿子添加到根节点中
- root.append(son1)
- root.append(son1)
- tree = ET.ElementTree(root)
- tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
- Element 创建xml方式
Element 创建xml方式
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- __author__ = 'liujianzuo'
- from xml.etree import ElementTree as ET
- tree = ET.parse("first.xml") # 直接解析xml格式文件
- root = tree.getroot() #利用getroot方法获取根节点
- # print(root.tag)
- # print(root.attrib)
- # print(root.text)
- # 同 字符串创建的两种方式来看 xml也有两种方式创建
- #2 利用 Element类直接创建 ======
- son = ET.Element("Biaoqian2",{"key":"value"})
- son.text="zhi"
- ele1 = ET.Element("qq",key2="value2", )
- ele1.text="woshizhi"
- root.append(son)
- son.append(ele1)
- tree.write("out2.xml")
- 在已有文件获取根节点情况 利用Element创建 二级三级节点
在已有文件获取根节点情况 利用Element创建 二级三级节点
创建方式(二)
- from xml.etree import ElementTree as ET
- # 创建根节点
- root = ET.Element("famliy")
- # 创建大儿子
- # son1 = ET.Element('son', {'name': '儿1'})
- son1 = root.makeelement('son', {'name': '儿1'})
- # 创建小儿子
- # son2 = ET.Element('son', {"name": '儿2'})
- son2 = root.makeelement('son', {"name": '儿2'})
- # 在大儿子中创建两个孙子
- # grandson1 = ET.Element('grandson', {'name': '儿11'})
- grandson1 = son1.makeelement('grandson', {'name': '儿11'})
- # grandson2 = ET.Element('grandson', {'name': '儿12'})
- grandson2 = son1.makeelement('grandson', {'name': '儿12'})
- son1.append(grandson1)
- son1.append(grandson2)
- # 把儿子添加到根节点中
- root.append(son1)
- root.append(son1)
- tree = ET.ElementTree(root)
- tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
- 利用 makeelement创建 Element类的对象 创建一个新文件
利用 makeelement创建 Element类的对象 创建一个新文件
- from xml.etree import ElementTree as ET
- tree = ET.parse("first.xml") # 直接解析xml格式文件
- root = tree.getroot() #利用getroot方法获取根节点
- print(root.tag)
- print(root.attrib)
- print(root.text)
- # 同 字符串创建的两种方式来看 xml也有两种方式创建
- #
- # 1 利用 makeelement创建 Element类的对象 =====
- son = root.makeelement("biaoqian",{"key":"value"})
- s = son.makeelement("biaoqian2",{"key2":"value"}) #Element类的对象
- son.append(s) #传入根的儿子的儿子
- root.append(son) # 传入根节点下,作为儿子
- tree.write("out.xml")
- 已有文件first.xml 利用 makeelement创建 Element类的对象
已有文件first.xml 利用 makeelement创建 Element类的对象
创建方式(三)
- from xml.etree import ElementTree as ET
- # 创建根节点
- root = ET.Element("famliy")
- # 创建节点大儿子
- son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
- # 创建小儿子
- son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
- # 在大儿子中创建一个孙子
- grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
- grandson1.text = '孙子'
- et = ET.ElementTree(root) #生成文档对象
- et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
- SubElement创建
SubElement创建
将生成的xml的标签加缩进后写入新文件
由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:
- from xml.etree import ElementTree as ET
- from xml.dom import minidom
- def prettify(elem):
- """将节点转换成字符串,并添加缩进。
- """
- rough_string = ET.tostring(elem, 'utf-8')
- reparsed = minidom.parseString(rough_string)
- return reparsed.toprettyxml(indent="\t")
- # 创建根节点
- root = ET.Element("famliy")
- # 创建大儿子
- # son1 = ET.Element('son', {'name': '儿1'})
- son1 = root.makeelement('son', {'name': '儿1'})
- # 创建小儿子
- # son2 = ET.Element('son', {"name": '儿2'})
- son2 = root.makeelement('son', {"name": '儿2'})
- # 在大儿子中创建两个孙子
- # grandson1 = ET.Element('grandson', {'name': '儿11'})
- grandson1 = son1.makeelement('grandson', {'name': '儿11'})
- # grandson2 = ET.Element('grandson', {'name': '儿12'})
- grandson2 = son1.makeelement('grandson', {'name': '儿12'})
- son1.append(grandson1)
- son1.append(grandson2)
- # 把儿子添加到根节点中
- root.append(son1)
- root.append(son1)
- raw_str = prettify(root)
- f = open("xxxoo.xml",'w',encoding='utf-8')
- f.write(raw_str)
- f.close()
- Element 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件
Element 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件
函数封装了 缩进和写入文件的功能
- from xml.etree import ElementTree as ET
- from xml.dom import minidom
- def MyWrite(root, file_path):
- rough_string = ET.tostring(root, 'utf-8')
- reparsed = minidom.parseString(rough_string)
- new_str = reparsed.toprettyxml(indent="\t")
- f = open(file_path, 'w', encoding='utf-8')
- f.write(new_str)
- f.close()
- root = ET.Element('family', {"age": ""})
- # son = ET.Element('family', {"age": "18"})
- # son = root.makeelement('family', {"age": "18"})
- # root.append(son)
- ET.SubElement(root,'family', {"age": ""})
- son = ET.SubElement(root,'family', {"age": "十一"})
- ET.SubElement(son,'family', {"age": ""})
- # tree = ET.ElementTree(root)
- # tree.write("out.xml", encoding='utf-8', short_empty_elements=False)
- # tree.write("out.xml", encoding='utf-8', xml_declaration=True)
- # ET.tostring()
- MyWrite(root, "nnnnn.xml")
- 传入 xml对象 和文件
传入 xml对象 和文件
4、命名空间
详细介绍,猛击这里
- from xml.etree import ElementTree as ET
- ET.register_namespace('com',"http://www.company.com") #some name
- # build a tree structure
- root = ET.Element("{http://www.company.com}STUFF")
- body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": ""})
- body.text = "STUFF EVERYWHERE!"
- # wrap it in an ElementTree instance, and save as XML
- tree = ET.ElementTree(root)
- tree.write("page.xml",
- xml_declaration=True,
- encoding='utf-8',
- method="xml")
- 命名空间
练习
1 xml 获取qq是否在线
- http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=627904863
- import requests
- from xml.etree import ElementTree as ET #XML 模块
- req = requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=1003408567")
- res = req.text #获取get到的字符串,用.text方法
- #解析xml格式内容
- #xml接受一个参数:字符串,格式化为特殊的对象
- node = ET.XML(res)
- if node.text == "Y":
- print("在线")
- elif node.text == "N":
- print("离线")
- elif node.text == "V":
- print("隐身")
2 获取列车时刻表 xml
- <DataSet xmlns="http://WebXml.com.cn/">
- <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="getDetailInfo">
- <xs:element name="getDetailInfo" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
- <xs:complexType>
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="TrainDetailInfo">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="TrainStation" type="xs:string" minOccurs="0"/>
- <xs:element name="ArriveTime" type="xs:string" minOccurs="0"/>
- <xs:element name="StartTime" type="xs:string" minOccurs="0"/>
- <xs:element name="KM" type="xs:short" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:choice>
- </xs:complexType>
- </xs:element>
- </xs:schema>
- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
- <getDetailInfo xmlns="">
- <TrainDetailInfo diffgr:id="TrainDetailInfo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
- <TrainStation>上海(车次:K234\K235)</TrainStation>
- <ArriveTime/>
- <StartTime>11:12:00</StartTime>
- <KM>0</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
- <TrainStation>昆山</TrainStation>
- <ArriveTime>11:45:00</ArriveTime>
- <StartTime>11:48:00</StartTime>
- <KM>49</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo3" msdata:rowOrder="2" diffgr:hasChanges="inserted">
- <TrainStation>苏州</TrainStation>
- <ArriveTime>12:12:00</ArriveTime>
- <StartTime>12:16:00</StartTime>
- <KM>84</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo4" msdata:rowOrder="3" diffgr:hasChanges="inserted">
- <TrainStation>无锡</TrainStation>
- <ArriveTime>12:44:00</ArriveTime>
- <StartTime>12:55:00</StartTime>
- <KM>126</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo5" msdata:rowOrder="4" diffgr:hasChanges="inserted">
- <TrainStation>常州</TrainStation>
- <ArriveTime>13:22:00</ArriveTime>
- <StartTime>13:26:00</StartTime>
- <KM>165</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo6" msdata:rowOrder="5" diffgr:hasChanges="inserted">
- <TrainStation>镇江</TrainStation>
- <ArriveTime>14:13:00</ArriveTime>
- <StartTime>14:16:00</StartTime>
- <KM>237</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo7" msdata:rowOrder="6" diffgr:hasChanges="inserted">
- <TrainStation>南京</TrainStation>
- <ArriveTime>15:04:00</ArriveTime>
- <StartTime>15:16:00</StartTime>
- <KM>301</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo8" msdata:rowOrder="7" diffgr:hasChanges="inserted">
- <TrainStation>蚌埠</TrainStation>
- <ArriveTime>17:27:00</ArriveTime>
- <StartTime>17:50:00</StartTime>
- <KM>485</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo9" msdata:rowOrder="8" diffgr:hasChanges="inserted">
- <TrainStation>徐州</TrainStation>
- <ArriveTime>19:38:00</ArriveTime>
- <StartTime>19:58:00</StartTime>
- <KM>649</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo10" msdata:rowOrder="9" diffgr:hasChanges="inserted">
- <TrainStation>商丘</TrainStation>
- <ArriveTime>22:12:00</ArriveTime>
- <StartTime>22:17:00</StartTime>
- <KM>795</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo11" msdata:rowOrder="10" diffgr:hasChanges="inserted">
- <TrainStation>开封</TrainStation>
- <ArriveTime>23:49:00</ArriveTime>
- <StartTime>23:53:00</StartTime>
- <KM>926</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo12" msdata:rowOrder="11" diffgr:hasChanges="inserted">
- <TrainStation>郑州</TrainStation>
- <ArriveTime>00:37:00</ArriveTime>
- <StartTime>01:14:00</StartTime>
- <KM>998</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo13" msdata:rowOrder="12" diffgr:hasChanges="inserted">
- <TrainStation>新乡</TrainStation>
- <ArriveTime>02:20:00</ArriveTime>
- <StartTime>02:22:00</StartTime>
- <KM>1078</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo14" msdata:rowOrder="13" diffgr:hasChanges="inserted">
- <TrainStation>鹤壁</TrainStation>
- <ArriveTime>03:01:00</ArriveTime>
- <StartTime>03:03:00</StartTime>
- <KM>1144</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo15" msdata:rowOrder="14" diffgr:hasChanges="inserted">
- <TrainStation>安阳</TrainStation>
- <ArriveTime>03:33:00</ArriveTime>
- <StartTime>03:36:00</StartTime>
- <KM>1185</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo16" msdata:rowOrder="15" diffgr:hasChanges="inserted">
- <TrainStation>邯郸</TrainStation>
- <ArriveTime>04:11:00</ArriveTime>
- <StartTime>04:16:00</StartTime>
- <KM>1245</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo17" msdata:rowOrder="16" diffgr:hasChanges="inserted">
- <TrainStation>邢台</TrainStation>
- <ArriveTime>04:47:00</ArriveTime>
- <StartTime>04:51:00</StartTime>
- <KM>1297</KM>
- </TrainDetailInfo>
- <TrainDetailInfo diffgr:id="TrainDetailInfo18" msdata:rowOrder="17" diffgr:hasChanges="inserted">
- <TrainStation>石家庄</TrainStation>
- <ArriveTime>06:05:00</ArriveTime>
- <StartTime/>
- <KM>1406</KM>
- </TrainDetailInfo>
- </getDetailInfo>
- </diffgr:diffgram>
- </DataSet>
- 列车时刻表
XML文件
- # 获取 列车时刻表
- import requests
- from xml.etree import ElementTree as ET
- # 使用第三方模块requests 发送HTTP请求,或者XML 格式内容
- r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=")
- result = r.text
- # 将 请求的字符串结果 通过xml的模块的方法转换成xml格式
- ret = ET.XML(result)
- for node in ret.iter("TrainDetailInfo"): # xml的iter是可迭代的 传参是 xml的标签的名
- # print(node.tag,node.attrib) # tag是标签
- # if not node.find("StartTime").text: # find 是查找标签内的文本的标签对应的内容
- # node.find("StartTime").text = "都到站了,管它几点呢,晚点你也得坐啊"
- print(node.find("TrainStation").text,node.find("StartTime").text)
- 完整查看xml列车时刻的代码
- import requests
- from xml.etree import ElementTree as ET
- # 使用第三方模块requests发送HTTP请求,或者XML格式内容
- url="http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode="
- tr=input("请输入列车号:")
- url=url+tr+"&UserID="
- req = requests.get(url)
- print(type(req))
- res = req.text #获取get到的字符串
- #解析XML格式内容,把字符串解析成xml。
- root=ET.XML(res)
- for node in root.iter("TrainDetailInfo"):
- # print(node.tag,node.attrib)
- print(node.find("TrainStation").text,node.find("StartTime").text)
python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml的更多相关文章
- Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml
模块分为三种: 自定义模块 内置模块 开源模块 一.安装第三方模块 # python 安装第三方模块 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+py ...
- Python模块/包/库安装几种方法(转载)
一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip或tar.gz),进行解压,CMD->cd进入模 ...
- Python基础(十)-模块
模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...
- python基础学习十 logging模块详细使用【转载】
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...
- python基础(10)--模块
模块(module) 模块,用一坨代码实现了某个功能的代码集合 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来 ...
- Python基础(12)--模块
本文地址:http://www.cnblogs.com/archimedes/p/python-modules.html,转载请注明源地址. 模块简介 如果你退出 Python 解释器重新进入,以前创 ...
- python基础教程总结9——模块,包,标准库
1. 模块 在python中一个文件可以被看成一个独立模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用. 1.1 模块搜索路径 导入模块时,是按照sys ...
- python基础:如何使用 pip 安装第三方库
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在这个生活中处处都是大数据和人工智能的时代,总是能在各种角落看到 Pyth ...
- 第六章:Python基础の反射与常用模块解密
本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...
随机推荐
- Codeforces Round #427 (Div. 2) - D
题目链接:http://codeforces.com/contest/835/problem/D 题意:给定一个字符串,定义kth回文是左半部分等于右半部分,并且左半部分和右半部分都是(k-1)th回 ...
- SpringCloud学习系列-Eureka自我保护模式(5)
什么是自我保护模式? 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒).但是当网络分区故障发生时,微服务与Eur ...
- PHP培训教程 php生成WAP页面
WAP(无线通讯协议)是在数字移动电话.个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准.由于静态的WAP页面在很多方面不能满足用户个性化的服务请求,因此通过WAP服务器端语言产生动态的W ...
- POJ 2385 Apple Catching ( 经典DP )
题意 : 有两颗苹果树,在 1~T 的时间内会有两颗中的其中一颗落下一颗苹果,一头奶牛想要获取最多的苹果,但是它能够在树间转移的次数为 W 且奶牛一开始是在第一颗树下,请编程算出最多的奶牛获得的苹果数 ...
- HDU 2243 考研路茫茫——单词情结 ( Trie图 && DP && 矩阵构造幂和 )
题意 : 长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义. 比如一共有2个词根 aa 和 ab ,则可能存在104个长度不超过3的单词, ...
- 【bzoj1398】Vijos1382寻找主人 Necklace
*题目描述: 给定两个项链的表示,判断他们是否可能是一条项链. *输入: 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). *输出: 如果两条项链不可能同 ...
- Linux 安装R包
https://www.cnblogs.com/jessepeng/p/10984983.html Linux 的R环境,可以通过anaconda jupyter notbook很容易的配置,见我之前 ...
- 设计模式学习笔记——Composite 组合模式
用于描述无限层级的复杂对象,类似于描述资源管理器,抽象出每一个层级的共同特点(文件夹和文件,展开事件) 以前描述一个对象,是将整个对象的全部数据都描述清楚,而组合模式通过在对象中定义自己,描述自己的下 ...
- 全球DC主机交流
全球DC主机交流https://www.globaldc.cn/ 全球DC主机交流论坛是一个综合性的国内服务器.国外服务器.高防清洗.硬件服务器交流论坛,主要为网友提供IP地址鉴定主机商,全球独立服务 ...
- Android-Studio:Cannot reload AVD list
Android-Studio:Cannot reload AVD list 今天用Android-Studio时点击"RUN"后出现如下错误,特此记录一下解决方案. Cannot ...