Python

文件读写

XML

import xml.etree.ElementTree as ET

对象获取

# 解析XML文件
xml_obj = ET.parse(file_path)
# 解析XML字符串
xml_string = '<root><element>Value</element></root>'

元素查找

# 获取XML文档的根元素
xml_root = xml_obj.getroot()
# 查找具有指定标签的第一个子元素
xml_element  = xml_root.find('element')
# 查找具有指定标签的所有子元素
xml_elements = xml_root.findall('element')

# 获取元素的名称
element_tag  = xml_element.tag
# 获取元素文本内容
element_text = xml_element.text
# 获取元素的所有属性值
element_attr = xml_element.attrib
# 获取元素的指定属性值
element_attribute = xml_element.get('value')

元素修改

# 修改节点名称
xml_element.tag  = "new_tag"
# 修改节点文本
xml_element.text = "new_text"
# 修改节点文本属性
xml_element.attrib = {}
xml_element.attrib["attribute"] = ""

# 保存文件
xml_obj.write(file_path)

元素增加

# 申请一个新的element对象
xml_element = ET.Element('new_xml_element')
# 设置文本名称
xml_element.text = "new_xml_tag"
# 设置属性值
xml_element.set('attribute', 'value')
# 加入节点中
root.append(xml_elements)

元素删除

# 删除节点
root.remove(xml_elements)

其他

doc = xml.dom.minidom.parse(file_path)
print(doc.getElementsByTagName("title")[0].firstChild.data)
print(doc.getElementsByTagName("original_filename")[0].firstChild.data)

NII

!pip install nibabel
import nibabel as nib

NIFI文件格式
NIFI2文件格式
nipy库api

对象获取

# 导入path路径的nii文件
nii_obj  = nib.load(file_path)

# 取得浮点图像数据
nii_data = nii_obj.get_fdata()

# 获得仿射的轴方向代码
nii_orientation = nib.aff2axcodes(nii_affine)

# 应用
import matplotlib.pyplot as plt
def show_slices(slices):
    """ 显示一行图像切片 """
    fig, axes = plt.subplots(1, len(slices))
    for i, slice in enumerate(slices):
        axes[i].imshow(slice.T, cmap="gray", origin="lower")

# 获得三个维度的切片
slice_0 = brain_tumor_img_data[(int)(brain_tumor_img_data.shape[0]/2), :, :]
slice_1 = brain_tumor_img_data[:, (int)(brain_tumor_img_data.shape[1]/2), :]
slice_2 = brain_tumor_img_data[:, :, (int)(brain_tumor_img_data.shape[2]/2)]
show_slices([slice_0, slice_1, slice_2])
plt.suptitle("Center slices for brain tumor image")

元素修改

# 将SpatialImage实例img保存到文件brain_tumour.nii
nib.save(brain_tumor_img, "brain_tumour.nii")

XLSX

import openpyxl

对象获取

# 获取xlsx对象
xlsx_obj = openpyxl.load_workbook(file_path)

元素查找

# 获取文件页名列表
xlsx_obj_sheet_name = xlsx_obj.sheetnames
# 获取第1页对象
xlsx_obj_sheet = xlsx_obj[xlsx_obj_sheet_name[0]]
# 得到页对象最大行数
xlsx_obj_sheet_row = xlsx_obj_sheet.max_row
# 得到页对象最大页数
xlsx_obj_sheet_col = xlsx_obj_sheet.max_column
# 得到页指定行列的数据(下标从1开始)
xlsx_obj_sheet.cell(1, 1).value

元素修改

# 重命名页对象名字
xlsx_obj_sheet.title = new_name_for_sheet
# 页对象指定行列的值
xlsx_obj_sheet.cell(1, 1).value
# 保存xlsx对象
xlsx_obj.save(file_path)

元素增加

# 创建一个xlsx对象
save_obj = openpyxl.Workbook()
# 创建一个页对象
save_sheet = save_obj.create_sheet(sheet_name, sheet_idx)

ZIP

import zipfile

对象获取

# 获取zip文件对象
zip_obj = zipfile.ZipFile(file_path, 'r')
# 关闭zip文件对象
zip_obj.close()

元素查找

# 查看zip文件中文件信息
zip_obj.infolist()
# 查看zip文件中文件名称
zip_obj.namelist()
# 通过文件名获取该文件信息
zip_obj.getinfo(filename)

元素解压

# 解压zip文件中单个文件
zip_obj.extract(filename, extract_path)
# 解压zip文件中所有文件
zip_obj.extractall(extract_path)
# 以二进制读取zip文件中指定文件
zip_obj.read(filename)

元素增加

# 创建zip对象
zip_obj = zipfile.ZipFile(file_path, 'w')
# 将要压缩文件加入zip对象中
zip_obj.write(ori_filepath,
              new_filepath, 
              zipfile.ZIP_STORED(仅存储不压缩)/ZIP_DEFLATED(zip算法)/ZIP_LZMA(lzma))
# 设置文件编码方式(不全???typora特有的写入失败)
zip_obj.comment=st

爬虫接口

# 导入模拟报文库
import requests
# 随机响应头
from fake_useragent import UserAgent

报文设置

## 要访问网页链接
set_url = "https://"
# 常用UserAgent
User_Agent = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36",
    "Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36",
]
# cookie设置, 可使用str或dict格式
cookie = "MUID=27D...; _EDGE_V=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=8E8...&dmnchg=1; MUIDB=27D...; MicrosoftApplicationsTelemetryDeviceId=59d..."
cookies = {
    "MUID": "27D...",
    "_EDGE_V": "1",
}
## 设置报文头防止被发现为爬虫
headers = {
    # User-Agent: 定义一个真实浏览器的代理名称, 表明自己的身份(是哪种浏览器)
    "User-Agent": "Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36",
    # "User-Agent": UserAgent()., # 🐎的, 逆天typora
    "User-Agent": User_Agent[0],
    # Accept: 告诉WEB服务器自己接受什么介质类型, */* 表示任何类型
    "Accept": "*/*",
    # Referer: 浏览器向WEB服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL
    "Referer": "https://www.baidu.com...",
    # Connection: 表示是否需要持久连接
    # Accept-Language: 浏览器申明自己接收的语言
    "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6",
    # Accept-Encoding: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip, deflate)
    "Accept-Encoding": "gzip, deflate",
    # 附带cookie
    'Cookie': cookie
}
## 代理, 尚不清楚原理
proxies = {
    "http": "http://127.0.0.1:7890",
    "https": "http://127.0.0.1:7890",  # https -> http
}
## http附带的参数
params = {
    'q'   : 'test',
    'qs'  : 'ds',
    'form': 'QBRE',
}

## 实例化session,通过session来发起请求会自动保持会话状态
session = requests.session()

# 构建表单数据
data = {
    'username': 'root',
    'password': 'FHGOxkHBOH4kOlQ',
}

quote&unquote

from urllib.parse import quote, unquote
中文转字符
word = '原神'
result = quote(word)   # %E5%8E%9F%E7%A5%9E

word = result
result = unquote(word) # 原神

报文发送

# 模拟访问, 返回结果为回复报文, 失败则捕获socket报错
try:
    response = requests.get(
        url, headers=headers, stream=True, verify=False, proxies=proxies, params=params
    )
except socket.error as e:
    print(e.args.__str__())
    
# 传入data进行请求
response = session.post(url, headers=headers, data=data)

报文解析

# 将回复报文转为字典格式
json_str = json.loads(response.text)
response属性属性含义
response.text响应体 str类型
response.content响应体 bytes类型
response.status_code响应 状态码
response.request.\_cookies响应 请求cookie
response.cookies响应 cookie(经过了set-cookie动作)
response.headers响应头
response.request.headers响应对应的请求头

soup模块

# 导入解析回复报文的库
from bs4 import BeautifulSoup
报文解析
# 解析回复报文
soup = BeautifulSoup(response.text, "html.parser")
内容查找
# 查找特定元素, 返回值为一个列表
item = soup.findAll("div",                   # 标签名
                    attrs={"class": "title"} # 具有特定属性的标签
                   ) 
# 取得标签对象的内容
item[0].string
item[0].text
# 取得标签对象的属性值
item[0]['id']

关闭连接

# 关闭连接?不太清楚用途
requests.session().keep_alive = False

# 关闭多余连接?不清楚
sess = requests.Session()
sess.mount('http://', HTTPAdapter(max_retries=3)) 
sess.mount('https://', HTTPAdapter(max_retries=3))     
sess.keep_alive = False 

GUI控制

import pyautogui
import pyperclip
import psutil

进程操作

# 获取所有正在运行进程的pid
allpids = psutil.pids()
# 根据pid查询进程名称
programe_name = psutil.Process(pid).name()

# 通过给出的程序执行文件地址打开程序
os.startfile(program_dir)

System info

参数含义
psutil.users()查看当前登录的用户信息<br/>name: 用户名<br/>terminal: 终端<br/>host: 主机地址<br/>started: 登录时间<br/>pid: 进程id
psutil.boot_time()查看系统的启动时间
psutil.test()模拟 ps 命令

CPU info

参数含义
psutil.cpu_count()CPU的逻辑核心数量
psutil.cpu_count(logical=False)CPU的物理核心数量
psutil.cpu_times()统计 CPU 的用户/系统/空闲时间
psutil.cpu_times_percent()统计 CPU 的用户/系统/空闲时间(百分比)
psutil.cpu_percent(interval=0.5, percpu=True)interval: 表示每隔0.5s刷新一次<br/>percpu: 表示查看所有的cpu使用率
psutil.cpu_stats()查看 CPU 的统计信息, 包括上下文切换、中断、软中断,以及系统调用次数等等
psutil.cpu_freq()查看 CPU 的频率

Memory info

参数含义
psutil.virtual_memory()查看内存使用情况<br/>total: 总内存<br/>available: 可用内存<br/>percent: 内存使用率<br/>used: 已使用的内存
psutil.swap_memory()查看交换内存信息

Disk info

参数含义
psutil.disk_partitions()查看磁盘分区、磁盘使用率和磁盘 IO 信息
psutil.disk_usage("C:\")查看某个磁盘使用情况
psutil.disk_io_counters()查看磁盘 IO 统计信息<br/>read_count: 读次数<br/>write_count: 写次数<br/>read_bytes: 读的字节数<br/>write_bytes: 写的字节数<br/>read_time: 读时间<br/>write_time: 写时间
psutil.disk_io_counters(perdisk=True)查看物理磁盘 IO 统计信息

Network info

参数含义
psutil.net_io_counters()查看网卡的网络 IO 统计信息<br/>bytes_sent: 发送的字节数<br/>bytes_recv: 接收的字节数<br/>packets_sent: 发送的包数据量<br/>packets_recv: 接收的包数据量<br/>errin: 接收包时, 出错的次数<br/>errout: 发送包时, 出错的次数<br/>dropin: 接收包时, 丢弃的次数<br/>dropout: 发送包时, 丢弃的次数
psutil.net_io_counters(pernic=True)列出所有网卡的信息
psutil.net_if_addrs()以字典的形式返回网卡的配置信息, 包括 IP 地址、Mac地址、子网掩码、广播地址等等
psutil.net_if_stats()返回网卡的详细信息, 包括是否启动、通信类型、传输速度、mtu
psutil.net_connections()查看当前机器的网络连接<br/>以列表的形式返回每个网络连接的详细信息<br/>里面接受一个参数, 默认是 "inet", 当然我们也可以指定为其它, 比如 "tcp"

Program info

参数含义
psutil.pid_exists(22333)查看某个进程是否存在
psutil.process_iter()返回所有进程(Process)对象组成的迭代器
psutil.Process(pid=0)根据 pid 获取一个进程对应的 Process 对象
process.name()进程名称
process.exe()进程的exe路径
process.cwd()进程的工作目录
process.cmdline()进程启动的命令行
process.pid()进程id
process.ppid()父进程id
process.parent()父进程
process.children()子进程列表
process.status()进程状态
process.username()进程用户名
process.create_time()进程创建时间
process.cpu_times()进程使用cpu时间
process.memory_info()进程所使用的的内存
process.open_files()进程打开的文件
process.connections()进程相关的网络连接
process.num_threads()进程内的线程数量
process.threads()进程内的所有线程信息
process.environ()进程的环境变量
process.terminal()结束进程, 返回 None

鼠标操作

# 获取鼠标当前位置
pyautogui.position()

# 点击事件
pyautogui.click(sizex,          # 绝对位置x坐标
                sizey,          # 绝对位置y坐标
                duration = 0.5, # 鼠标移动延迟
                button='right', # 点击键
                clicks = 3,     # 点击次数
                interval=0.1,   # 点击间隔
               )
               
# 鼠标按下
pyautogui.mouseDown(sizex,          # 绝对位置x坐标
                    sizey,          # 绝对位置y坐标
                    button='right', # 按下鼠标右键
                   )
                 
# 鼠标移动
pyautogui.moveTo(sizex,          # 绝对位置x坐标
                 sizey,          # 绝对位置y坐标
                )
                
# 鼠标松开
pyautogui.mouseUp()

键盘操作

# 依次按下键
pyautogui.hotkey('ctrl', 'v')

复制粘贴

# 将字符串存至剪切板, 粘贴可用pyautogui的键盘操作
pyperclip.copy(copy_str)
最后修改:2025 年 03 月 22 日
赛博讨口子