【100天精通python】Day29:文件与IO操作_JSON文件处理

news2024/11/23 20:42:16

目录

 专栏导读 

一、XML文件概述

1. 标签和元素

2. 嵌套结构

3. 属性

4. 命名空间

5. CDATA节

6. 注释

 7. 验证与验证语言

8. 扩展性

二、XML文件处理常见操作

1. 解析XML文件

2. 创建和编辑XML文件

3. 修改XML文件

4. 查询XML元素

5  遍历XML元素

6. 删除XML元素

7. 使用lxml库

8. 处理XML命名空间

命名空间的基本概念

在XML中声明命名空间

使用XPath与命名空间

默认命名空间

处理多个命名空间

三、 XML文件操作常见问题与解决

1. XML文件不存在或无法打开

2. 解析错误

3. 查询元素不存在

4. 节点文本为空


 专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html


一、XML文件概述

XML(eXtensible Markup Language)是一种用于描述结构化数据的标记语言。它被广泛用于数据存储、传输和交换,适用于各种应用领域,如Web开发、配置文件、数据交换和数据存储等。XML的主要特点包括:

1. 标签和元素

XML使用标签(Tag)来标识数据的不同部分,每个标签包含在尖括号中,如<tag>。标签可以用来定义元素(Element),表示数据的具体部分。元素可以包含文本、属性、子元素等。

2. 嵌套结构

XML允许元素嵌套在其他元素内部,从而创建层次结构,用于表示复杂的数据关系。

<bookstore>
  <book>
    <title>XML Basics</title>
    <author>John Smith</author>
  </book>
  <book>
    <title>Advanced XML</title>
    <author>Jane Doe</author>
  </book>
</bookstore>

3. 属性

XML元素可以具有属性(Attributes),用于提供有关元素的附加信息。属性位于元素的开始标签内部。

<book title="XML Basics">
  <author>John Smith</author>
</book>

4. 命名空间

XML支持使用命名空间(Namespace)来避免元素名的冲突。命名空间通过为元素名称添加前缀来区分不同的命名空间。

<ns1:book xmlns:ns1="http://example.com/ns1">
  <ns1:title>XML Basics</ns1:title>
</ns1:book>

5. CDATA节

CDATA节允许在元素内部包含文本数据,即使其中包含特殊字符也不会被解析。

<description><![CDATA[This is some <b>bold</b> text.]]></description>

6. 注释

XML支持添加注释,用于对数据进行解释说明或标记。

<!-- This is a comment -->
<book>
  <!-- Book information goes here -->
</book>

 7. 验证与验证语言

XML文档可以使用验证语言(如DTD、XML Schema、RELAX NG等)进行验证,以确保其结构和内容符合预期。

8. 扩展性

XML的设计初衷是具有极高的扩展性,允许用户根据需要定义自己的元素和结构,以满足特定的数据表示需求。

总之,XML是一种通用的、可扩展的数据表示格式,用于在不同应用和系统之间传输和存储数据。尽管XML在一些场景中逐渐被JSON、YAML等其他格式取代,但在某些情况下,仍然是非常有用和重要的数据交换工具。

二、XML文件处理常见操作

在Python中,处理XML文件涉及到多种常用操作。以下是一些常见的XML文件处理操作:

1. 解析XML文件

使用内置的xml.etree.ElementTree模块解析XML文件。

import xml.etree.ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

# 遍历根元素的子元素
for child in root:
    print("Element:", child.tag)
    for sub_element in child:
        print("  Sub Element:", sub_element.tag, "Value:", sub_element.text)

2. 创建和编辑XML文件

使用xml.etree.ElementTree模块创建和编辑XML文件。

import xml.etree.ElementTree as ET

root = ET.Element("data")

item1 = ET.SubElement(root, "item")
ET.SubElement(item1, "name").text = "John"
ET.SubElement(item1, "age").text = "30"

item2 = ET.SubElement(root, "item")
ET.SubElement(item2, "name").text = "Alice"
ET.SubElement(item2, "age").text = "25"

tree = ET.ElementTree(root)
tree.write("output.xml")

3. 修改XML文件

使用xml.etree.ElementTree模块可以修改XML文件

import xml.etree.ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

# 修改数据
for child in root:
    if child.find("name").text == "John":
        child.find("age").text = "31"

tree.write("modified.xml")

4. 查询XML元素

使用XPath表达式来查询和选择XML元素。

import xml.etree.ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

# 使用XPath查询
for item in root.findall("./item[name='John']"):
    age_element = item.find("age")
    if age_element is not None:
        print("John's age:", age_element.text)

5  遍历XML元素

遍历XML文档的元素,以访问、处理和操作其中的数据。

# 遍历子元素
for child in root:
    print("Element:", child.tag)
    for sub_element in child:
        print("  Sub Element:", sub_element.tag, "Value:", sub_element.text)

6. 删除XML元素

可以使用remove()方法删除XML元素。

import xml.etree.ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

# 删除元素
for item in root.findall("./item[name='Alice']"):
    root.remove(item)

tree.write("updated.xml")

7. 使用lxml库

lxml是一个高效且功能强大的Python库,用于处理XML和HTML数据。它基于C语言的libxml2和libxslt库构建而成,提供了快速、灵活和易于使用的API,适用于解析、创建、修改和查询XML和HTML文档。这个完整的代码示例涵盖了lxml库的一些常见操作,帮助你理解如何使用lxml处理XML数据。

假设我们有一个名为data.xml的XML文件:

<root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2">
  <ns1:item>
    <ns1:name>John</ns1:name>
    <ns1:age>30</ns1:age>
  </ns1:item>
  <ns2:item>
    <ns2:name>Alice</ns2:name>
    <ns2:age>25</ns2:age>
  </ns2:item>
</root>

 下面是使用lxml库的一些常见操作示例:

from lxml import etree

# 解析XML文件
tree = etree.parse("data.xml")
root = tree.getroot()

# 定义命名空间
namespaces = {"ns1": "http://example.com/ns1", "ns2": "http://example.com/ns2"}

# 查询并输出John的年龄
john_age = root.xpath("//ns1:item[ns1:name='John']/ns1:age", namespaces=namespaces)[0]
print("John's age:", john_age.text)

# 遍历所有item元素
for item in root.xpath("//ns1:item", namespaces=namespaces):
    name = item.find("ns1:name", namespaces=namespaces).text
    age = item.find("ns1:age", namespaces=namespaces).text
    print("Name:", name, "Age:", age)

# 创建新元素
new_item = etree.Element("{http://example.com/ns1}item")
new_name = etree.SubElement(new_item, "{http://example.com/ns1}name")
new_name.text = "Eve"
new_age = etree.SubElement(new_item, "{http://example.com/ns1}age")
new_age.text = "28"

# 添加新元素到根元素
root.append(new_item)

# 修改Alice的年龄
alice_age = root.xpath("//ns2:item[ns2:name='Alice']/ns2:age", namespaces=namespaces)[0]
alice_age.text = "26"

# 删除John的元素
john_item = root.xpath("//ns1:item[ns1:name='John']", namespaces=namespaces)[0]
root.remove(john_item)

# 将修改写回XML文件
tree.write("output_lxml.xml", pretty_print=True)

        无论使用内置的xml.etree.ElementTree还是lxml库,处理XML文件时都要考虑数据的结构和格式,以确保正确地解析、创建、修改和操作XML数据。 

8. 处理XML命名空间

如果XML文件使用了命名空间,需要使用命名空间前缀来访问和操作元素。

namespaces = {"ns": "http://example.com/ns1"}
for element in root.findall("ns:book", namespaces):
    print("Book Title:", element.find("ns:title", namespaces).text)

         XML命名空间(Namespace)是一种机制,用于在XML文档中标识和区分不同来源的元素和属性,以避免名称冲突。命名空间在处理多个XML文档合并、数据交换和数据共享时非常有用。XML命名空间通过为元素和属性名称添加前缀来定义,使其在不同的命名空间中唯一。

命名空间的基本概念

  • 命名空间URI(Namespace URI): 命名空间的唯一标识符,通常是一个URL或URI,用于表示命名空间的名称。
  • 命名空间前缀(Namespace Prefix): 一个短字符串,用于在XML文档中标识使用了哪个命名空间。通常以xmlns关键字声明,如xmlns:prefix="namespace_uri"

在XML中声明命名空间

<root xmlns:ns1="http://example.com/ns1">
  <ns1:element>Content</ns1:element>
</root>

        在上面的例子中,xmlns:ns1="http://example.com/ns1"声明了一个名为ns1的命名空间前缀,与URI http://example.com/ns1 相关联。因此,ns1:element 中的 ns1 表示这个元素属于指定的命名空间。

使用XPath与命名空间

        XPath查询语句中的元素名也需要使用命名空间前缀来定位。

from lxml import etree

tree = etree.parse("data.xml")
root = tree.getroot()

namespaces = {"ns": "http://example.com/ns1"}
for element in root.findall("ns:element", namespaces):
    print("Element:", element.text)

默认命名空间

XML中还可以使用默认命名空间,但在XPath中使用默认命名空间稍有不同。默认命名空间在XPath中没有前缀。

<root xmlns="http://example.com/ns1">
  <element>Content</element>
</root>
from lxml import etree

tree = etree.parse("data.xml")
root = tree.getroot()

namespaces = {"default": "http://example.com/ns1"}
for element in root.findall(".//default:element", namespaces):
    print("Element:", element.text)

处理多个命名空间

如果XML中包含多个命名空间,需要在查询中使用相应的命名空间前缀。

<root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2">
  <ns1:element>Content 1</ns1:element>
  <ns2:element>Content 2</ns2:element>
</root>
from lxml import etree

tree = etree.parse("data.xml")
root = tree.getroot()

namespaces = {"ns1": "http://example.com/ns1", "ns2": "http://example.com/ns2"}
for element in root.findall("ns1:element", namespaces):
    print("Element from ns1:", element.text)
for element in root.findall("ns2:element", namespaces):
    print("Element from ns2:", element.text)

XML命名空间是一种重要的概念,特别是在处理多个XML文档合并、交换数据和共享数据时。通过正确理解和使用命名空间,可以避免名称冲突,确保数据的正确性和一致性。

三、 XML文件操作常见问题与解决

        处理XML文件时,可能会遇到一些特殊的异常情况,需要进行特殊的异常处理。以下是一些可能的特殊异常情况及其处理方法:

1. XML文件不存在或无法打开

问题: 当指定的XML文件不存在或无法打开时,会引发FileNotFoundError异常。

处理方法: 在打开文件之前,使用tryexcept语句捕获异常,进行相应的处理。

import xml.etree.ElementTree as ET

try:
    tree = ET.parse("data.xml")
    root = tree.getroot()
except FileNotFoundError:
    print("XML file not found.")
except ET.ParseError:
    print("Error parsing XML file.")

2. 解析错误

问题: 解析XML文件时,如果文件格式不符合XML规范,会引发xml.etree.ElementTree.ParseError异常。

处理方法: 捕获ParseError异常,进行错误处理。

import xml.etree.ElementTree as ET

try:
    tree = ET.parse("data.xml")
    root = tree.getroot()
except ET.ParseError:
    print("Error parsing XML file.")

3. 查询元素不存在

问题: 当使用XPath查询时,如果查询的元素不存在,会引发TypeErrorAttributeError等异常。

处理方法: 在使用查询结果之前,检查是否存在查询的元素,以避免引发异常。

import xml.etree.ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

name_element = root.find("./item[name='NonExistentName']")
if name_element is not None:
    print("Name:", name_element.text)
else:
    print("Name not found.")

4. 节点文本为空

问题: 有时节点的文本可能为空,访问节点的text属性可能引发AttributeError异常。

处理方法: 在访问节点文本属性之前,使用if语句检查节点是否具有文本。

import xml.etree.ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

age_element = root.find("./item[name='John']/age")
if age_element is not None and age_element.text:
    age = age_element.text
else:
    age = "Age not available"

print("Age:", age)

处理XML文件时,要注意捕获特定的异常类型,并根据异常的类型进行适当的处理。这有助于在处理异常时提供更有用的错误信息和解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式虚拟仿真实验教学平台之串口发送数据

嵌入式虚拟仿真实验教学平台课程系列 串口发送数据实验 课程内容 本实验使用 STM32 的串口发送数据。开始仿真后,打开串口监视器&#xff0c;串口监视器会打印出要发送的数据。 课程目标 学习配置使用GPIO功能学习配置使用复用功能学习配置使用UART功能 硬件设计 本课程…

扩散模型(DDPM)介绍

文章目录 扩散模型扩散过程前向过程逆向过程 网络结构 文章主要介绍了DDPM扩散模型&#xff0c;包含了详细的数学推导&#xff0c;可能公式有点多&#xff0c;但是只要能够耐心看完&#xff0c;相信会有一些收获的。好了下面进入正题。 扩散模型 扩散模型是一种新的生成模型&a…

FPGA纯verilog实现 LZMA 数据压缩,提供工程源码和技术支持

目录 1、前言2、我这儿已有的FPGA压缩算法方案3、FPGA LZMA数据压缩功能和性能4、FPGA LZMA 数据压缩设计方案输入输出接口描述数据处理流程LZ检索器数据同步LZMA 压缩器 为输出LZMA压缩流添加文件头 5、vivado仿真6、福利&#xff1a;工程代码的获取 1、前言 说到FPGA的应用&…

stm32项目(4)——基于stm32的厨房安全检测系统

目录 1.功能介绍 2.硬件方案 1.单片机的选择 2.显示屏的选择 3.温湿度传感器 4.烟雾传感器 5.甲醛传感器 6.排气风扇 3.程序设计 1.接线方式 2.大致思路 1.功能介绍 本次设计的厨房安全检测系统的功能如下&#xff1a; 利用单片机、烟雾传感器、甲醛传感器、温湿度传感器…

LeetCode-Java(03)

9. 回文数 class Solution {public boolean isPalindrome(int x) {if (x < 0 || (x % 10 0 && x ! 0)) {return false;}int revertedNumber 0;while (x > revertedNumber) {revertedNumber revertedNumber * 10 x % 10;x / 10;}// 当长度为奇数时通过reverte…

现代C++中的从头开始深度学习:【5/8】卷积

一、说明 在上一个故事中&#xff0c;我们介绍了机器学习的一些最相关的编码方面&#xff0c;例如 functional 规划、矢量化和线性代数规划。 现在&#xff0c;让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…

【从零学习python 】04. Python编程基础:变量、数据类型与标识符

文章目录 变量以及数据类型一、变量的定义二、变量的类型三、查看数据类型 标识符和关键字标识符命名规则命名规范 关键字进阶案例 变量以及数据类型 一、变量的定义 对于重复使用&#xff0c;并且经常需要修改的数据&#xff0c;可以定义为变量&#xff0c;来提高编程效率。…

kubeasz在线安装K8S集群单master

1.基础系统配置 确保在干净的系统上开始安装&#xff0c;不能使用曾经装过kubeadm或其他k8s发行版的环境 系统是Ubuntu 或者CentOS 7 2.下载文件 2.1 下载工具脚本ezdown&#xff0c;举例使用kubeasz版本3.5.0 #此版本默认安装的是 K8S v1.26.0 export release3.5.0 wget h…

初遇C++之语法篇(完结)

&#x1f9c3;博客主页:阿博历练记 &#x1f4d6;文章专栏:c &#x1f68d;代码仓库:阿博编程日记 &#x1f361;欢迎关注:欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f36d;1.函数重载&#x1f4dc;1.1函数重载的概念&#x1f4e2;1.2函数重载三大误区&#x1f3…

Nacos单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

第十五章 定义 HL7 的 DTL 数据转换

文章目录 第十五章 定义 HL7 的 DTL 数据转换 第十五章 定义 HL7 的 DTL 数据转换 每个接口可能需要一定数量的数据转换。创建转换时&#xff0c;不要使用保留的包名称。 重要提示&#xff1a;请勿在数据转换中手动更改 HL7 转义序列&#xff1b;自动处理这些。 可以使用“数…

智能状态监测如何帮助设备管理团队转型升级?

制造业面临人才短缺和生产力提升的双重挑战。然而&#xff0c;全球市场对生产效率和产品质量的要求依然高企。这些挑战的核心在于&#xff0c;制造业需要在日益复杂的环境下&#xff0c;实时识别并应对生产过程中的异常情况&#xff0c;确保生产持续稳定。 一、传统状态监测的限…

Android 13 Hotseat定制化修改

一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher中,下面开始…

深度学习中的优化算法

文章目录 前言一、优化和深度学习1.1 优化的目标1.2 深度学习中的优化挑战1.2.1 局部最小值1.2.2 鞍点1.2.3 梯度消失 二、梯度下降2.1 一维梯度下降2.1.1 学习率 2.2 多元梯度下降2.3 自适应方法2.3.1 牛顿法2.3.2 其他自适应方法 三、随机梯度下降3.1 随机梯度更新3.2 动态学…

JS逆向之顶像滑块

本教程仅限于学术探讨&#xff0c;也没有专门针对某个网站而编写&#xff0c;禁止用于非法用途、商业活动、恶意滥用技术等&#xff0c;否则后果自负。观看则同意此约定。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目录 一、接口请求流程 二、C1包 三、ac 四…

HTTP协议学习笔记1

初识HTTP 输入网址进入网页过程发生了什么&#xff1f; DNS解析&#xff1a;浏览器会向本地DNS服务器发出域名解析请求&#xff0c;如果本地DNS服务器中没有对应的IP地址&#xff0c;则会向上级DNS服务器继续发出请求&#xff0c;直到找到正确的IP地址为止。 建立TCP连接&…

关于Log日志

日志常用的如Logback&#xff0c;方便查看日志和打印的SQL&#xff08;或配合idea的一些mybaits日志插件&#xff09;&#xff0c;简单讲讲。 Logback等级 ALL < TRACE < DEBUG < INFO < WARN < ERROR <FATAL <OFF 配置文件结构 configuration appender…

微信小程序读取本地json

首先在项目录下新建【server】文件夹&#xff0c;新建data.js文件&#xff0c;并定义好json数据格式。如下&#xff1a; pages/index/index.ts导入data.js并请求json pages/index/index.wxml页面展示数据

365. 水壶问题

365. 水壶问题 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 365. 水壶问题 https://leetcode.cn/problems/water-and-jug-problem/description/ 完成情况&#xff1a; 解题思路&#xff1a; /**在任意一个时刻…