Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml
模块分为三种:
- 自定义模块
- 内置模块
- 开源模块
一、安装第三方模块
- # python 安装第三方模块
- # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+python的scripts路径
- (1) python管理工具 pip
- # python3 -m pip install requests # 3版本安装
- (2) 源码安装
- 解压
- cmd
- 进到包路径
- python setup.py install
windows下安装第三方模块---报错
- 如果找不到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.
windows下安装第三方模块报错
模块路径
- #获取路径
- import sys
- for i in sys.path:
- print(i)
- #输出结果:
- S:\Myproject
- S:\Python 3.5.1\python35.zip
- S:\Python 3.5.1\DLLs
- S:\Python 3.5.1\lib #存放标准库
- S:\Python 3.5.1
- S:\Python 3.5.1\lib\site-packages #存放第三方库,扩充库
- #添加路径
- import sys
- import os
- pre_path = os.path.abspath('../')
- sys.path.append(pre_path)
二、自定义模块(也就我们自己写的python代码)
模块的导入:
- import module
- from module.xx.xx import xx
- from module.xx.xx import xx as rename
- from module.xx.xx import *
模块导入之后的调用
- 第一种:
- 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 _*_
- __author__ = 'liujianzuo'
- def login():
- return "login"
- def register():
- return "register"
- def logout():
- return "logout"
模块的默认查找路径
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】
将某一个路径加入到环境变量
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
- # 将d盘写的一个脚本加入到sys路径
- 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)
三、模块
random 模块(随机数)
- import random
- print(random.random()) #用于生成一个0到1的随机符点数: 0 <= n < 1.0
- print(random.randint(1,2)) #用于生成一个指定范围内的整数
- print(random.randrange(1,10)) #从指定范围内,按指定基数递增的集合中获取一个随机数
- print(random.uniform(1,10)) #用于生成一个指定范围内的随机符点数
- print(random.choice('nick')) #从序列中获取一个随机元素
- li = ['nick','jenny','car',]
- random.shuffle(li) #用于将一个列表中的元素打乱
- print(li)
- li_new = random.sample(li,2) #从指定序列中随机获取指定长度的片断(从li中随机获取2个元素,作为一个片断返回)
- print(li_new)
demo 利用random生成随机验证码:
- import random
- temp = ''
- for i in range(4):
- num = random.randrange(0,4)
- if num == 0 or num == 3: #一半的概率
- rad2 = random.randrange(0,10)
- temp = temp + str(rad2)
- else:
- rad1 = random.randrange(65,91)
- c1 = chr(rad1)
- temp = temp + c1
- print(temp)
1、os 模块(用于提供系统级别的操作)
- os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
- os.curdir 返回当前目录: ('.')
- os.pardir 获取当前目录的父目录字符串名:('..')
- os.makedirs('dir1/dir2') 可生成多层递归目录
- os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
- os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.remove() 删除一个文件
- os.rename("oldname","new") 重命名文件/目录
- 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"))
os的demo
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- 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)
demo2
- 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,
重点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.getcwd())
- print(os.path.dirname(__file__))
- p1 = os.path.dirname(__file__)
- p2 = "bin"
- new_dir = os.path.join(p1,p2)
- sys.path.append(new_dir)
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(将文件名和参数做成列表返回)
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- import sys
- print(sys.argv)
- saltstack_s:/share/py_test/s8 # py s9_argv.py 9 9 9 9
- ['s9_argv.py', '9', '9', '9', '9']
- sys.stdout.write()
- sys.stdout.flush()刷新屏幕缓存io
demo 进度条
- import os,sys,time
- for i in range(101):
- sys.stdout.write('\r%s %s%%' % ('#'*int(i/100*100),int(i/100*100)))
- sys.stdout.flush()
- # s+='#'
- # print('%s %s%%' %(s,int(i/50*100)))
- time.sleep(0.2)
- # for i in range(101): #改进一下
- # #显示进度条百分比 #号从1开始 空格从99递减
- # hashes = '#' * int(i / 100.0 * 100)
- # spaces = ' ' * (100 - len(hashes))
- # sys.stdout.write("\r[%s] %d%%" % (hashes + spaces, i))
- # sys.stdout.flush()
- # time.sleep(0.05)
3、时间模块time和datetime
时间相关的操作,时间有三种表示方式:
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
- import time
- print(time.time()) #返回当前系统时间戳(1970年1月1日0时0分0秒开始)
- print(time.ctime()) #输出Tue May 17 16:07:11 2016,当前系统时间
- print(time.ctime(time.time() - 86400)) #将时间戳转换为字符串格式
- print(time.gmtime(time.time() - 86400)) #将时间戳转换为struct_time格式
- print(time.localtime(time.time() - 86400)) #将时间戳转换为struct_time格式,返回本地时间
- print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
- #time.sleep(5) #sleep停顿
- print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())) #将struct_time格式转成指定的字符串格式
- print(time.strptime("2016-05-17","%Y-%m-%d")) #将字符串格式转换成struct_time格式
- print("----------------------------------------------------------------")
- import datetime
- print(datetime.date.today()) #输出格式 2016-05-17
- print(datetime.date.fromtimestamp(time.time() - 86400)) #2016-05-16 将时间戳转成日期格式
- current_time = datetime.datetime.now()
- print(current_time) #输出2016-05-17 16:18:28.737561
- print(current_time.timetuple()) #返回struct_time格式
- print(current_time.replace(2008,8,8)) #输出2008-08-08 16:21:34.798203,返回当前时间,但指定的值将被替换
- str_to_date = datetime.datetime.strptime("28/7/08 11:20","%d/%m/%y %H:%M") #将字符串转换成日期格式
- new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天
- new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
- new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
- new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
- print(new_date)
4、hashlib
- 加密方式 3种:
- 1 对称加密
- 加密算法:
- DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des
- AES:128位 高级加密标准
- 3DES:3次加密后的
- 2公钥加密
- 加密算法:
- RSA, EIGamal, DSA
- 应用场景
- 1、密钥交换
- 2、身份认证
- 3单向加密
- 加密算法
- 抽取数据特征码:
- MD5, SHA1, SHA512, CRC-32(循环冗余校验码)
- import hashlib
- # ######## md5 ########
- hash = hashlib.md5()
- # help(hash.update)
- hash.update(bytes('admin', encoding='utf-8'))
- print(hash.hexdigest())
- print(hash.digest())
- ######## 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())
- ##### 加盐 ######
- # ######## md5 ########
- hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
- hash.update(bytes('admin',encoding="utf-8"))
- print(hash.hexdigest())
- #python内置还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密
- import hmac
- h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
- h.update(bytes('admin',encoding="utf-8"))
- print(h.hexdigest())
加密案例 登录 注册
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- __author__ = 'liujianzuo'
- import hashlib
- def md5(arg):
- """
- :param arg:
- :return:
- """
- obj = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8")) #这里是输入的盐值 ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
- obj.update(bytes(arg,encoding="utf-8")) #更新哈希对象以字符串参数 其实就是你的铭文密码
- return obj.hexdigest()
- def login(user,pwd):
- with open("account.db","r",encoding="utf-8") as f:
- for line in f:
- u,p = line.split("|")
- if u == user and p == md5(pwd):
- return True
- else:
- return False
- def register(user,pwd):
- with open("account.db","a",encoding="utf-8") as f:
- username = user
- password = md5(pwd)
- # print(password)
- # print(type(password))
- # exit()
- temp = username +"|"+ password
- f.write(temp)
- return True
- def main():
- print("""
- 1 登陆
- 2 注册
- """)
- chose = input("pls input ur choice:").strip()
- chose = int(chose)
- if chose == 1:
- user = input("username:")
- passwd = input("password:")
- ret = login(user,passwd)
- if ret:
- print("login success")
- else:
- print("login error")
- elif chose == 2:
- user = input("register username:")
- passwd = input("register password:")
- ret = register(user,passwd)
- if ret:
- print("register success")
- else:
- print("register error")
- if __name__ == '__main__':
- main()
5、pickle和json
- json 用于【字符串】和【python基本的数据类型】之间进行转换
- pickle 用于【python特有的类型】和【python基本数据类型】间进行转换
dump()函数接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存 到给定的文件中。当我们使用load()函数从文件中取出已保存的对象时,pickle知道如何恢复这些对象到它们本来的格式。
dumps()函数执行和dump() 函数相同的序列化。取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据。
loads()函数执行和load() 函数一样的反序列化。取代接受一个流对象并去文件读取序列化后的数据,它接受包含序列化后的数据的str对象, 直接返回的对象。
ps dump 区别 存入文件
- # _*_ coding:utf-8 _*_
- __author__ = 'liujianzuo'
- 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,
- }
- },
- }
dumps dump 区别 存入文件
操作:
- import pickle
- # dumps 直接传存储对象
- f = open("account.db","wb")
- f.write(pickle.dumps(accounts))
- f.close()
- #dump除了传存储对象还有 打开的文件句柄
- f = open("account1.db","wb")
- pickle.dump(accounts,f)
- f.close()
load loads 区别 这里注意文件指针 一次read 就到结尾
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- import pickle
- f = open("account.db","rb")
- acc = pickle.loads(f.read())
- f.close()
- f = open("account1.db","rb")
- acc_load = pickle.load(f)
- print(acc_load)
加载到内存修改后再存入文件
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- __author__ = 'liujianzuo'
- 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序列化
loads 方法 将传过来的字符串(长得像python的字典或者列表数据类型)序列化成字典或者列表
注意:其调用的内部必须是双引号,json不识别单引号,而且整个字符串必须被单引号或者双引号引起来
dumps 方法 将python数据类型列表或者字典转换成形似字典或者列表的字符串
- n = {'status': '1000', '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': '1000', 'data': 'invilad'}
- m = [1, 2, 3]
- # dump 功能就是 先转换为字符串,再写入文件
- json.dump(n,open("db",'w'))
- # load 功能就是 读取文件字符串 并转化为python数据类型
- r = json.load(open("db",'r'))
- print(r,type(r))
重点 : 我们接收的网页请求过来是字符串或者字节
- from urllib import request
- f = request.urlopen("http://www.cnblogs.com/")
- # f = request.urlopen("http://yujuanfudan.blog.163.com/")
- ret = f.read()
- print(type(ret))
- print(str(ret,encoding="utf-8"))
7、request 第三方模块
发送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')
发送携带请求头的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')
模块的使用
- # 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请求
- # 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请求
- 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)
其他请求
Http请求和xml实例
demo 1检测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("离线")
检测QQ是否在线
demo 2 检测火车停靠信息
- 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模块
课上练习:
- <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)
8.1、解析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对象
- from xml.etree import ElementTree as ET
- # 直接解析xml文件
- tree = ET.parse("xo.xml")
- # 获取xml文件的根节点
- root = tree.getroot()
利用ElementTree.parse将文件直接解析成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解析和保存的方式
8.2、操作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)
两种解析文件方式,遍历xml文档所有内容
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)
两种解析文件的方式,遍历xml中指定的节点
c、修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件
1 解析字符串方式,修改,保存
- 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') #如果更改内容有中文就需要指定编码了
以open文件句柄方式打开文件并解析的文件,要最后生成ElementTree对象才能write
2 解析文件方式,修改,保存
- 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')
而以parse打开的文件,就是ElementTree对象,就有write方法
d、删除节点
1 解析字符串方式打开,删除,保存
- 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 解析文件方式打开,删除,保存
- 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文件保存方法
创建 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方式
- #!/usr/bin/env python
- # _*_ coding:utf-8 _*_
- 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创建 二级三级节点
创建方式(二)
- 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类的对象 创建一个新文件
- 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类的对象
创建方式(三)
- 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创建
将生成的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 生成根 各节点 并传入给处理标签的函数,并将返回对象写入文件
函数封装了 缩进和写入文件的功能
- 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对象 和文件
命名空间
- 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": "123"})
- 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")
- 命名冲突
- 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
- 这个 XML 文档携带着某个表格中的信息:
- <table>
- <tr>
- <td>Apples</td>
- <td>Bananas</td>
- </tr>
- </table>
- 这个 XML 文档携带有关桌子的信息(一件家具):
- <table>
- <name>African Coffee Table</name>
- <width>80</width>
- <length>120</length>
- </table>
- 假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。
- XML 解析器无法确定如何处理这类冲突。
- 使用前缀来避免命名冲突
- 此文档带有某个表格中的信息:
- <h:table>
- <h:tr>
- <h:td>Apples</h:td>
- <h:td>Bananas</h:td>
- </h:tr>
- </h:table>
- 此 XML 文档携带着有关一件家具的信息:
- <f:table>
- <f:name>African Coffee Table</f:name>
- <f:width>80</f:width>
- <f:length>120</f:length>
- </f:table>
- 现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。
- 通过使用前缀,我们创建了两种不同类型的 <table> 元素。
- 使用命名空间(Namespaces)
- 这个 XML 文档携带着某个表格中的信息:
- <h:table xmlns:h="http://www.w3.org/TR/html4/">
- <h:tr>
- <h:td>Apples</h:td>
- <h:td>Bananas</h:td>
- </h:tr>
- </h:table>
- 此 XML 文档携带着有关一件家具的信息:
- <f:table xmlns:f="http://www.w3school.com.cn/furniture">
- <f:name>African Coffee Table</f:name>
- <f:width>80</f:width>
- <f:length>120</f:length>
- </f:table>
- 与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。
- 命名冲突 长命名引用
命名冲突 长命名引用
Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml的更多相关文章
- python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- 常用模块random/os/sys/time/datatime/hashlib/pymysql等
一.标准模块 1.python自带的,import random,json,os,sys,datetime,hashlib等 ①.正常按照命令:打开cmd,执行:pip install rangdom ...
- 模块random+os+sys+json+subprocess
模块random+os+sys+json+subprocess 1. random 模块 (产生一个随机值) import random 1 # 随机小数 2 print(random.rando ...
- Python全栈之路目录结构
基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...
- Python 常用内建模块(os, sys,random)
一.os 模块 1,操作系统与环境变量 import osprint(os.name) #操作系统类型,如果是posix 说明系统是linux unix 或 mac os x :如果是nt 就是win ...
- Python 五个常用模块资料 os sys time re built-in
1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', ' ...
- Python内置模块:random,os,sys,和加密模块hashlib
random import random # 导入模块 随机数 import random # 内置的 print(random.random()) #0-1 之间随机小数(18位有效数字) p ...
- python 常用模块之random,os,sys 模块
python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...
- Python 全栈开发六 常用模块学习
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve configparser hashlib 一. ...
随机推荐
- PHP、JAVA、C#、Object-C 通用的DES加密
PHP.JAVA.C#.Object-C 通用的DES加密 PHP: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
- jquery选择器之子元素
HTML代码: :first-child 匹配第一个子元素,每个父元素的第一个子元素 :last-child 匹配最后一个子元素,每个父元素的最后一个子元素 <!DOCTYPE html> ...
- Asp.net MVC中 Controller 与 View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...
- 【转】css学习专题-BFC
css学习专题-BFC 转自:原文链接:css学习专题-BFC文章目录 BFC:Block Formatting Context. BFC就是一种布局方式,在这种布局方式下,盒子们自所在的 conta ...
- ADF_Starting系列7_使用EJB/JPA/JSF通过ADF构建Web应用程序之创建UI View
2013-05-01 Created By BaoXinjian
- sql server 相似度对比
转自:http://www.dotblogs.com.tw/rachen/archive/2008/10/07/5611.aspx 函數一.產生 Like 比對用字串 ) ) ) as begin / ...
- Chap2: question: 1 - 10
1. 赋值运算符函数(或应说复制拷贝函数问题) class A { private: int value; public: A(int n) : value(n) {} A(A O) { value ...
- 洛谷P3368 【模板】树状数组 2
P3368 [模板]树状数组 2 102通过 206提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 如题,已知一个数列,你需要进行下面两 ...
- Android RadioGroup设置默认选中项
今天有人问.Android 里面 RadioGroup里面有两个RadioButton怎么设置默认值? 第一个RadioButton设置 android:checked="true" ...
- oracle创建包后执行报错:object omgmig.test_package is invalid.
今天学习了一下oracle的包的写法,然后碰到这么个问题.包声明和包主体都正确,但是就是执行报错:object omgmig.test_package is invalid. 这是会报错的sql,看起 ...