Python脚本开发总结
本文总结一些平时写Python脚本常用的一些知识点,主要是一些通过python脚本实现一些功能时使用到的一些库的使用方法及遇到的问题。
Python基础
Python基础参考:https://www.cnblogs.com/vonlinee/p/19003646
常用文件操作工具函数
创建路径
def create_path_if_not_exists(path, mode=0o755):
"""
创建路径,如果任意子路径不存在则进行创建
Args:
path (str): 要创建的路径
mode (int): 目录权限模式,默认为0o755
Returns:
bool: 创建成功返回True,否则返回False
"""
try:
# 如果路径不存在,则创建
if not os.path.exists(path):
os.makedirs(path, mode=mode, exist_ok=True)
print(f"已创建路径: {path}")
else:
# 检查路径是否为目录
if not os.path.isdir(path):
raise NotADirectoryError(f"路径 {path} 已存在但不是目录")
print(f"路径已存在: {path}")
return True
except Exception as e:
print(f"创建路径失败: {path},错误: {str(e)}")
return False
调用系统命令
通过内置的os模块实现
# 在子终端运行系统命令,不能获取命令执行后的返回信息以及执行返回的状态
import os
os.system('date')
# 不仅执行命令而且返回执行后的信息对象(常用于需要获取执行命令后的返回信息)
nowtime = os.popen('date')
print(nowtime.read())
操作JSON
在 Python 中操作 JSON 数据主要通过内置的 json 模块来实现。
data = {
"name": "Alice",
"age": 30,
"city": "New York"
}
# 用 json.dumps() 方法将 Python 对象(如字典或列表)转换为 JSON 字符串。
json_string = json.dumps(data)
print(json_string)
# 使用 json.dump() 方法将 Python 对象写入文件
with open('data.json', 'w') as json_file:
json.dump(data, json_file)
# 使用 json.loads() 方法将 JSON 字符串转换为 Python 对象。
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'
data = json.loads(json_string)
print(data)
# 使用 json.load() 方法从 JSON 文件读取数据。
with open('data.json', 'r') as json_file:
data = json.load(json_file)
print(data)
遍历json结构
import json
json_string = '''
{
"name": "Alice",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"postal_code": "10001"
},
"hobbies": ["reading", "traveling", "swimming"]
}
'''
# 解析 JSON 字符串
data = json.loads(json_string)
def traverse_json(obj, indent=0):
"""递归遍历 JSON 对象并打印键值对"""
if isinstance(obj, dict):
for key, value in obj.items():
print(' ' * indent + str(key) + ":")
traverse_json(value, indent + 4) # 增加缩进
elif isinstance(obj, list):
for index, item in enumerate(obj):
print(' ' * indent + f"[{index}]:")
traverse_json(item, indent + 4) # 增加缩进
else:
print(' ' * indent + str(obj))
# 调用函数
traverse_json(data)
操作XML
Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:
1.SAX (simple API for XML ):Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
2.DOM(Document Object Model):将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。
3.ElementTree:ElementTree 在 python3中已经作为标准库存在了,所以这里不需要我们额外的安装
https://docs.python.org/3/library/xml.etree.elementtree.html
ElementTree
官方文档:https://docs.python.org/zh-cn/3.10/library/xml.etree.elementtree.html
ElementTree 支持通过 XPath 进行节点选择, xpath语法参考:https://www.w3school.com.cn/xpath/index.asp
通过 ET.parse 即可解析出来 xml
import xml.etree.ElementTree as ET
with open('test.xml', 'tr', encoding='utf-8') as rf:
tree = ET.parse(rf)
print(child.attrib) # 输出所有属性
print(child['name']) # 通过字典样式访问属性
print(child['value']) # 通过字典样式访问属性
读取节点的属性
写入XML注释问题
# 保留注释
class CommentedTreeBuilder (ET.TreeBuilder):
def comment(self,data):
self.start(ET.Comment,{})
self.data(data)
self.end(ET.Comment)
parser = ET.XMLParser(target=CommentedTreeBuilder())
tree = ET.parse(xml_path,parser=parser)
Python 3.12.1
import xml.etree.ElementTree as ET
parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True))
tree = ET.parse('newXml.xml', parser=parser)
parent = tree.find('.//NAME[@property="Name"]')
change = parent.find('VALUE[@type="string"]')
change.text = 'new value'
tree.write("test.xml", encoding='utf-8', xml_declaration=True)
获取子节点
Python2.x版本
在 Python 2.x 中,你可以使用 getchildren() 方法来获取子节点
# 解析 XML
root = ET.fromstring(xml_data)
# 获取子节点
children = root.getchildren()
for child in children:
print(child.tag, child.text)
在 Python 3.x 中,getchildren() 方法已被移除。你可以直接使用 list() 将节点的 iter() 或 findall() 方法与切片结合起来获取子节点。而在新版本中是通过 iter(tag) 进行创建迭代器的。但tag=None或者 * 表示所有子孙节点,其他的情况就只查找指定tag 名称的集合。
import xml.etree.ElementTree as ET
xml_data = '''
<root>
<child1>Value1</child1>
<child2>Value2</child2>
</root>
'''
# 解析 XML
root = ET.fromstring(xml_data)
# 返回所有子节点
children = list(root)
for child in children:
print(child.tag, child.text)
转为字符串
设置 encoding='unicode' 以返回 Unicode 字符串。
# 将解析得到的 XML 对象转换为字符串
text_bytes = ET.tostring(existing_property, encoding='utf-8', method='xml')
text = text_bytes.decode()
要将 XML 转换为字符串并保持良好的格式,可以使用 xml.etree.ElementTree 模块的 tostring() 函数,并结合 minidom 来美化输出。minidom是python3内置标准库模块,无需额外安装
import xml.etree.ElementTree as ET
from xml.dom import minidom
# 示例 XML 数据
xml_data = '''
<configuration>
<property>
<name>hive.exec.script.wrapper</name>
<value/>
<description/>
</property>
</configuration>
'''
# 解析 XML
root = ET.fromstring(xml_data)
# 将解析得到的 XML 对象转换为字符串
xml_string = ET.tostring(root, encoding='utf-8', method='xml')
# 使用 minidom 格式化字符串
formatted_xml = minidom.parseString(xml_string).toprettyxml(indent=" ")
# 输出结果
print(formatted_xml)
格式问题
在使用 xml.etree.ElementTree 将 XML 节点写入文件并希望保留良好的格式(如缩进和换行)时,可以使用以下方法:
tree = ET.ElementTree(root)
ET.indent(tree, space="\t", level=0)
tree.write(file_name, encoding="utf-8")

浙公网安备 33010602011771号