一、

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文件的开头和结尾分别调用:startDocumentendDocument方法。 characters(text)方法通过参数text传递XML文件的字符数据。

ContentHandler在每个元素的开头和结尾被调用。如果解析器不在命名空间模式下,则调用startElement(tag,attributes)endElement(tag)方法; 否则,调用相应的方法startElementNSendElementNS方法。 这里,tag是元素标签,属性是Attributes对象。

以下是继续前面了解的其他重要方法 -

parse()方法

以下方法创建一个SAX解析器并使用它来解析文档

xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Python

以下是参数的详细信息 -

  • 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)相关推荐

  1. 在pycharm中无法引入同一目录下的python文件

    问题 同一目录下存在以下两个python文件: 1. app.py 2. forms.py 现在我希望在app.py中引入forms.py的某个函数,但是出现如下情况: 主要表现在: 函数标红 无法自 ...

  2. 关于python文件读写小结

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

  3. Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

    目录 1.创建项目 2.将.ui文件生成.py文件 2.1.Eric 6编译 2.2.Python命令行编译 2.3.脚本编译 3.界面.逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装 ...

  4. python 文件追加写入_Python写入文件–解释了打开,读取,追加和其他文件处理功能

    python 文件追加写入 欢迎 (Welcome) Hi! If you want to learn how to work with files in Python, then this arti ...

  5. Python 文件 close() 方法

    描述 Python 文件 close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误. close() 方法允许调用多次. 当 file 对 ...

  6. python文件和目录

    # -*- coding: utf-8 -*-import osdef printFile(rootDir):allFiles = os.listdir(rootDir) #列出文件夹下所有文件和目录 ...

  7. 深度学习运行python文件,出现跨路径搜索其他module,怎么解决?

    在运行的目标python文件顶部,添加需要用的模块的搜索路径: 1)import sys, os sys.path.append(os.pardir) #添加的路径是,待运行目标python文件所在文 ...

  8. 第九课.Python文件操作

    Python文件读写 最基本的,通过open返回文件句柄(文件对象),将文件读入内存: #f是一个文件对象 f=open('./sample.txt') data=f.read()#read读取所有内 ...

  9. sys.argv[n] (终端运行python文件第n个参数) 在 pycharm 中的应用

    sys.argv[n] (终端运行python文件第n个参数) 在 pycharm 中的应用 打开pycharm --> Run --> Edit Configurations --> ...

  10. python文件信息排序_python文件排序的方法总结

    在python环境中提供两种排序方案:用库函数sorted()对字符串排序,它的对象是字符:用函数sort()对数字排序,它的对象是数字,如果读取文件的话,需要进行处理(把文件后缀名'屏蔽'). (1 ...

最新文章

  1. 粉丝该从哪里来?搞定这8种吸粉渠道
  2. 0 开发的准备工作一一虚拟机virturalbox
  3. 回归模型的score得分为负_Sklearn模型中预测值的R2_score为负数的问题探讨
  4. 苹果电脑怎么设置佳博标签打印机_自动接单、打印快,手动调节音量,佳博推出后厨专用智能打印机...
  5. python队列是线程安全的吗_python – 为什么我的多进程队列看起来不是线程安全的?...
  6. MockupBuilder
  7. python的socks5全局代理_Python写的Socks5协议代理服务器
  8. [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]
  9. 翰文付费打印后还有水印吗_免费开通小程序商城?!有支付功能吗?
  10. Safari new Date()
  11. [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树
  12. java的循环控制结构有哪些_java中的控制结构(if,循环)详解
  13. 双非,比赛经历对找算法类工作有帮助吗?
  14. FISCO BCOS Solidity 智能合约 返回多个值
  15. 校园edu无网络访问解决方案
  16. 什么是安全隔离R型变压器?
  17. 【JavaScript 刨根问底之】requestAnimationFrame以及延时器
  18. 经济危机下的国际名牌
  19. Activiti多人会签的实现 Activiti
  20. Reactive的值没有响应式

热门文章

  1. db2 10.5 数据库审计
  2. 服务器安全证书认证失败,【证书验证失败】证书验证失败怎么解决、怎么办_佰佰安全网...
  3. 《战胜华尔街》之25条股票投资黄金法则
  4. 扑克王怎样于市场中基于金叉死叉进行趋势跟踪
  5. 1.搭建Java+Selenium+WebDriver测试环境
  6. hdu 2050折现分割平面
  7. 7-8 整数四则运算 (10分)
  8. 大数据之linux虚拟机的复制以及环境配置
  9. (三)爬取一些网页图片
  10. 解析几何--对称,平移和旋转