PYthon--(文件I/O)
一、
1.绝对路径的读取
通过编码格式来读取文件中的中文
foo=open(R'D:\python项目\记事本.txt','r+',encoding='utf-8')#编码格式必须与文件的编码格式一致 R:去掉特殊符
text=foo.read()
print(text)
2.文件读取得其他方法:
readline():读取一行,直到一行结束
foo=open(R'D:\python项目\记事本.txt','r+',encoding='utf-8')
#循环读取 以行为单位 读取全部内容
text=foo.readline()
while len(text)!=0:print(text)text = foo.readline()
执行命令得
1.python---java2.python---java3.python---java
readlines():多行读取
foo=open(R'D:\python项目\记事本.txt','r+',encoding='utf-8')
fjava=open('D:\python项目\java记事本.txt','w+',encoding='utf-8')
text=foo.readlines()
print(text)
for li in text:fjava.write(li.replace('python','java'))#将读取到的python换为java 并且写入fjava文件中print(li)
print(type(text)) #<class 'list'>
print(len(text)) # 以行为单位: 输出为 3
foo.close()
fjava.close()
print('复制并替换完成')
执行命令得
['\ufeff\ufeff1.python---java\n', '2.python---java\n', '3.python---java']
1.python---java2.python---java3.python---java
<class 'list'>
3
复制并替换完成
二、类似爬虫
模拟浏览器获得源代码爬所需要的东西
源代码的获取
from urllib import request#请求(request)打开一个url
response=request.urlopen('https://www.baidu.com/')
#在本地创建一个文件
xm=open('baidu.txt','w',encoding='utf-8')
#读取网页中的源代码 并写入新创建的文件中
txt=response.read()
xm.write(str(txt.decode()))
xm.close()
执行命令得
#baidu.txt文件中
<html><head><script>location.replace(location.href.replace("https://","http://"));</script></head><body><noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript></body></html>
三、XML(EXtensible Markup Language),可扩展标记语言
1.特点:XML与操作系统 编程语言的开发平台无关
实现不同系统之间的数据交换
2.作用:数据交换
配置应用程序和网站
3.XML文档内容由一系列标签元素组成
<元素名 属性名='属性值'>元素内容</元素名>
属性值用双引号包裹
一个元素可以有多个属性
属性值中不能直接包含<、"、&(不建议: ' >)
4.标签编写注意事项
所有XML元素都必须有结束标签
XML标签对大小写敏感
XML必须正确嵌套
同级标签以缩进对齐
元素名称可以包含字母 数字或其他的字符
元素名称不能以数字或者标点符号开始
元素名称中不能含空格
5.Python中提供的XML解析方式:
方法 | 特点 |
SAX |
SAX解析通过流模式在解析XML的过程中触发对应的事件(start_element、char_data、end_element)并调用用户定义的回调函数来处理XML文件。 |
DOM |
将XML数据在内存中解析成一个树,通过对树的操作来操作XML,占用内存大,解析速度较慢,优点是可以任意遍历树的节点。 |
ElementTree |
类似一个轻量级的DOM,也是本篇文章主要介绍的。 |
6.准备一份XML格式的文件(文件名为lianxi.xml)
<?xml version="1.0"?>
<data><country name="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country>
</data>
7.XML格式介绍
<tag attrib = > text </tag> tail
例:<APP_KEY channel = 'CSDN'> hello123456789 </APP_KEY>
- tag,即标签,用于标识该元素表示哪种数据,即APP_KEY
- attrib,即属性,用Dictionary形式保存,即{'channel' = 'CSDN'}
- text,文本字符串,可以用来存储一些数据,即hello123456789
- tail,尾字符串,并不是必须的,例子中没有包含。
7.ElementTree解析XML文件的过程:
导入ElementTree,import xml.etree.ElementTree as ET
解析XML文件找到根节点
直接捷信XML文件并获得根节点:tree=ET.parse('country_datat.xml') root=tree.getroot()
解析字符串: root=ET.fromstring(country_datat_as_string)
遍历根节点可以获得子节点,然后就可以根据要求拿到需要的字段了
源码演示:
import xml.etree.ElementTree as ET#1.先加载文档到内存里 形成一个倒桩的树结构
tree=ET.parse('lianxi.xml')
#2.获取根节点
root=tree.getroot()
print('root-tag:',root.tag,'root-attrib:',root.attrib,'root-text:',root.text)
for child in root:print('child-tag:',child.tag,'child-attrib:',child.attrib,'child-text:',child.text)for sub in child:print('sub-tag是:', sub.tag, ',sub.attrib:', sub.attrib, ',sub.text:', sub.text)
执行命令得
root-tag: data root-attrib: {} root-text: child-tag: country child-attrib: {'name': 'Liechtenstein'} child-text: sub-tag是: rank ,sub.attrib: {} ,sub.text: 1
sub-tag是: year ,sub.attrib: {} ,sub.text: 2008
sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 141100
sub-tag是: neighbor ,sub.attrib: {'name': 'Austria', 'direction': 'E'} ,sub.text: None
sub-tag是: neighbor ,sub.attrib: {'name': 'Switzerland', 'direction': 'W'} ,sub.text: None
child-tag: country child-attrib: {'name': 'Singapore'} child-text: sub-tag是: rank ,sub.attrib: {} ,sub.text: 4
sub-tag是: year ,sub.attrib: {} ,sub.text: 2011
sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 59900
sub-tag是: neighbor ,sub.attrib: {'name': 'Malaysia', 'direction': 'N'} ,sub.text: None
child-tag: country child-attrib: {'name': 'Panama'} child-text: sub-tag是: rank ,sub.attrib: {} ,sub.text: 68
sub-tag是: year ,sub.attrib: {} ,sub.text: 2011
sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 13600
sub-tag是: neighbor ,sub.attrib: {'name': 'Costa Rica', 'direction': 'W'} ,sub.text: None
sub-tag是: neighbor ,sub.attrib: {'name': 'Colombia', 'direction': 'E'} ,sub.text: None
8.查找节点
当XML文件较大或者其中的子节点tag非常多的时候,一个一个获取是比较麻烦的而且有很多我们不要的,这样就可以通过find('nodeName')或者findall('nodeName')方法来查找指定的节点
find('nodeName'):表示在该节点下,查找其中第一个tag为nodeName的节点。
findall('nodeName'):表示在该节点下,查找其中所有tag为nodeName的节点
import xml.etree.ElementTree as ETtree=ET.parse('lianxi.xml')
root=tree.getroot()
animNode=root.find('country')#查找root节点下第一个tag为country得节点
print(animNode.tag,animNode.attrib,animNode.text)
执行命令得
country {'name': 'Liechtenstein'}
9.删除指定的节点以及保存
在合并Manifest文件的时候,可能有一些重复的权限,那么怎么删除掉呢,删除指定节点可以通过remove(node)方法,移除指定的节点。
删除属性name为Liechtenstein节点
import xml.etree.ElementTree as ETtree=ET.parse('lianxi.xml')
root=tree.getroot()
animNode=root.find('country')#查找root节点下第一个tag为country得节点
print(animNode.tag,animNode.attrib,animNode.text)
if animNode.attrib['name'] =='Liechtenstein':root.remove(animNode)
tree.write('lianxi.xml')#保存修改后的XML文件
执行命令得
<data><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor direction="N" name="Malaysia" /></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country>
</data>
三、XML解析器 体系结构和API
Python标准库提供了一组极少使用但有用的接口来处理XML.两个基本和最广泛使用在XML数据的API是SAX 和XDOM接口
简单的XML(SAX) 在这里,注册感兴趣的时间回调,然后让解析器继续执行文档.当文档较大或存在内存限制时,此功能非常有用,它会从文件读取文件时解析文件,并且整个文件不会储存在内存中.
文档对象模型(DOM)API这是一个万维网联盟的推荐,它将整个文件读入储存起并以分层(基于树)得形式存储,以表示XML文档的所有功能
当处理大文件时,SAX显然无法与DOM一样快地处理信息。 另一方面,使用DOM专门可以真正地占用资源,特别是如果要加许多文件使用的时候。
SAX是只读的,而DOM允许更改XML文件。由于这两种不同的API相辅相成,在大型项目中一般根据需要使用它们。
对于我们所有的XML代码示例,使用一个简单的XML文件:movies.xml作为输入 -
<?xml version="1.0" encoding="utf-8" ?>
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2013</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description>
</movie><movie title = "Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description>
</movie>
</collection>
SAX是事件驱动的XML解析的标准接口。 使用SAX解析XML通常需要通过子类化xml.sax.ContentHandler
来创建自己的ContentHandler
。
ContentHandler
处理XML样式/风格的特定标签和属性。 ContentHandler
对象提供了处理各种解析事件的方法。它拥有的解析器在解析XML文件时调用ContentHandler
方法。
在XML文件的开头和结尾分别调用:startDocument
和endDocument
方法。 characters(text)
方法通过参数text
传递XML文件的字符数据。
ContentHandler
在每个元素的开头和结尾被调用。如果解析器不在命名空间模式下,则调用startElement(tag,attributes)
和endElement(tag)
方法; 否则,调用相应的方法startElementNS
和endElementNS
方法。 这里,tag
是元素标签,属性是Attributes
对象。
以下是继续前面了解的其他重要方法 -
parse()方法
以下方法创建一个SAX解析器并使用它来解析文档
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
以下是参数的详细信息 -
- xmlfile - 这是要读取的XML文件的名称。
- contenthandler - 这必须是
ContentHandler
对象。 - errorhandler - 如果指定,
errorhandler
必须是SAX ErrorHandler
import xml.sax
class MovieHandler(xml.sax.ContentHandler):def __init__(self):self.CurrentData = ""#当前读取的对象节点属性self.type = ""self.format = ""self.year = ""self.rating = ""self.stars = ""self.description = ""def startElement(self, tag, attributes):self.CurrentData = tagif tag == "movie":print ("*****Movie*****")title = attributes["title"]print ("Title:", title)# Call when an elements endsdef endElement(self, tag):if self.CurrentData == "type":print ("Type:", self.type)elif self.CurrentData == "format":print ("Format:", self.format)elif self.CurrentData == "year":print ("Year:", self.year)elif self.CurrentData == "rating":print ("Rating:", self.rating)elif self.CurrentData == "stars":print ("Stars:", self.stars)elif self.CurrentData == "description":print ("Description:", self.description)self.CurrentData = ""# Call when a character is readdef characters(self, content):#传递if self.CurrentData == "type":self.type = contentelif self.CurrentData == "format":self.format = contentelif self.CurrentData == "year":self.year = contentelif self.CurrentData == "rating":self.rating = contentelif self.CurrentData == "stars":self.stars = contentelif self.CurrentData == "description":self.description = contentif ( __name__ == "__main__"):# create an XMLReaderparser = xml.sax.make_parser()# turn off namepsaces 工作目录parser.setFeature(xml.sax.handler.feature_namespaces, 0)# override the default ContextHandlerHandler = MovieHandler()parser.setContentHandler( Handler )parser.parse("movie.xml")
执行命令
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2013
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
PYthon--(文件I/O)相关推荐
- 在pycharm中无法引入同一目录下的python文件
问题 同一目录下存在以下两个python文件: 1. app.py 2. forms.py 现在我希望在app.py中引入forms.py的某个函数,但是出现如下情况: 主要表现在: 函数标红 无法自 ...
- 关于python文件读写小结
读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...
- Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)
目录 1.创建项目 2.将.ui文件生成.py文件 2.1.Eric 6编译 2.2.Python命令行编译 2.3.脚本编译 3.界面.逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装 ...
- python 文件追加写入_Python写入文件–解释了打开,读取,追加和其他文件处理功能
python 文件追加写入 欢迎 (Welcome) Hi! If you want to learn how to work with files in Python, then this arti ...
- Python 文件 close() 方法
描述 Python 文件 close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误. close() 方法允许调用多次. 当 file 对 ...
- python文件和目录
# -*- coding: utf-8 -*-import osdef printFile(rootDir):allFiles = os.listdir(rootDir) #列出文件夹下所有文件和目录 ...
- 深度学习运行python文件,出现跨路径搜索其他module,怎么解决?
在运行的目标python文件顶部,添加需要用的模块的搜索路径: 1)import sys, os sys.path.append(os.pardir) #添加的路径是,待运行目标python文件所在文 ...
- 第九课.Python文件操作
Python文件读写 最基本的,通过open返回文件句柄(文件对象),将文件读入内存: #f是一个文件对象 f=open('./sample.txt') data=f.read()#read读取所有内 ...
- sys.argv[n] (终端运行python文件第n个参数) 在 pycharm 中的应用
sys.argv[n] (终端运行python文件第n个参数) 在 pycharm 中的应用 打开pycharm --> Run --> Edit Configurations --> ...
- python文件信息排序_python文件排序的方法总结
在python环境中提供两种排序方案:用库函数sorted()对字符串排序,它的对象是字符:用函数sort()对数字排序,它的对象是数字,如果读取文件的话,需要进行处理(把文件后缀名'屏蔽'). (1 ...
最新文章
- 粉丝该从哪里来?搞定这8种吸粉渠道
- 0 开发的准备工作一一虚拟机virturalbox
- 回归模型的score得分为负_Sklearn模型中预测值的R2_score为负数的问题探讨
- 苹果电脑怎么设置佳博标签打印机_自动接单、打印快,手动调节音量,佳博推出后厨专用智能打印机...
- python队列是线程安全的吗_python – 为什么我的多进程队列看起来不是线程安全的?...
- MockupBuilder
- python的socks5全局代理_Python写的Socks5协议代理服务器
- [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]
- 翰文付费打印后还有水印吗_免费开通小程序商城?!有支付功能吗?
- Safari new Date()
- [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树
- java的循环控制结构有哪些_java中的控制结构(if,循环)详解
- 双非,比赛经历对找算法类工作有帮助吗?
- FISCO BCOS Solidity 智能合约 返回多个值
- 校园edu无网络访问解决方案
- 什么是安全隔离R型变压器?
- 【JavaScript 刨根问底之】requestAnimationFrame以及延时器
- 经济危机下的国际名牌
- Activiti多人会签的实现 Activiti
- Reactive的值没有响应式