python3:文件与异常
本来这篇教程是打算在base python数据类型之后出的,但是计划赶不上变化,反正最后都要融会贯通,今日有时间、今天遇到了类似的问题,就今天做这一模块的整理,顺序不是重点。
参考我的上一篇博客:https://blog.csdn.net/weixin_62528784/article/details/144705158
本篇博客的核心在于File对象以及相应的open方法,OS对象以及相应的方法
参考:https://www.runoob.com/python/python-files-io.html
一,文件及文件基本操作
文件本质上也是数据,数据的集合,文件操作和我们处理一些基本的python中数据类型本质上也没什么区别,
处理原子类型的数据,和处理集合类型的数据
目录与文件,以linux的系统文件组织为主,这一块可以再重温一下:
1,谈到文件夹和文件,少不了的就是绝对路径以及相对路径了,
# 绝对路径
# 1,win系统中:
win_path="C:\\Users\\Administrator\\Desktop\\generate.pl"# 2,linux系统中(主):
linux_path="/data1/project/generate.pl"
很简单,linux系统中pwd之类怎么写的文件路径,文件操作的时候只需要在外面再加上“”即可;
windows系统中同理,因为windows系统中路径的话,其实我们潜移默化已经习惯了盘符层层递进的写法,而且我们更早习惯了转义字符的概念,所以我们同样写路径+外面套双引号(注意路径中的盘符,以及转义符号即可,与linux习惯的反过来双层斜杠,我想用R读写文件习惯了的人,这一点基础应该很快就能够融汇贯通)。
2,另外需要提一下在python中对文件系统的一些常见的操作,在os模块下
(1)获取当前工作目录
import os# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
(2)修改当前工作目录
# 修改当前工作目录
os.chdir('/path/to/new/directory')
print(f"修改后的工作目录: {os.getcwd()}")
(3)创建目录
# 创建单级目录
os.mkdir('new_folder')# 创建多级目录
os.makedirs('parent_folder/child_folder')
(4)删除目录
# 删除单级目录(目录必须为空)
os.rmdir('new_folder')# 删除多级目录
os.removedirs('parent_folder/child_folder')
(5)检查路径是否存在
# 检查路径是否存在
path = '/path/to/check'
if os.path.exists(path):print(f"路径存在: {path}")
else:print(f"路径不存在: {path}")
(6)判断路径类型
path = '/path/to/check'# 判断是否为文件
if os.path.isfile(path):print(f"{path} 是一个文件")# 判断是否为目录
if os.path.isdir(path):print(f"{path} 是一个目录")
(7)获取文件或目录的绝对路径
# 获取绝对路径
absolute_path = os.path.abspath('relative_path')
print(f"绝对路径: {absolute_path}")
(8)分割路径:
path = '/path/to/file.txt'# 分割路径和文件名
dir_name, file_name = os.path.split(path)
print(f"目录: {dir_name}, 文件名: {file_name}")# 分割文件名和扩展名
file_base, file_ext = os.path.splitext(file_name)
print(f"文件名: {file_base}, 扩展名: {file_ext}")
我实际应用的1个例子:
file_path = "/data1/project/generate.pl"
if os.path.exists(file_path):print(f"路径{file_path}存在")if os.path.isfile(file_path):print(f"路径{file_path}是一个文件")dir_name,file_name = os.path.split(file_path)print(f"开始分割路径{file_path}为目录和文件\n")print(f"目录为{dir_name},文件为{file_name}\n")print(f"开始分割文件{file_path}为文件名和拓展名\n")file_base,file_ext = os.path.splitext(file_name)print(f"文件名为{file_base},拓展名为{file_ext}\n")# 拓展名为.pl,我们可以通过[1:]来获取拓展名print(f"实拓展名为{file_ext[1:]}\n")else:print(f"路径{file_path}是一个目录")
else:print(f"路径{file_path}不存在")
(9)列出目录内容
# 列出当前目录下的所有文件和子目录
contents = os.listdir('.')
print(f"目录内容: {contents}")
(10)重命名文件或目录
# 重命名文件或目录
os.rename('old_name', 'new_name')
(11)删除文件
# 删除文件
os.remove('file_to_delete.txt')
(12)获取文件或目录的属性
path = '/path/to/file_or_directory'# 获取文件大小(字节)
size = os.path.getsize(path)
print(f"文件大小: {size} 字节")# 获取最后修改时间
mod_time = os.path.getmtime(path)
print(f"最后修改时间: {mod_time}")
(13)拼接路径
# 拼接路径
new_path = os.path.join('/path/to', 'subdir', 'file.txt')
print(f"拼接后的路径: {new_path}")# 可以使用f"{os.getcwd()}"拼接当前工作路径
(14)获取环境变量
# 获取环境变量
home_dir = os.environ.get('HOME')
print(f"HOME 环境变量: {home_dir}")
可以尝试获取各种已经安装软件的环境变量,这一块操作比较私密,仅提供代码,不提供示例图。
获取所有环境变量:
import os# 获取所有环境变量
env_vars = os.environ# 打印所有环境变量
for key, value in env_vars.items():print(f"{key}: {value}")
获取特定软件的环境变量:
如果你知道某个软件的环境变量前缀(例如 JAVA_HOME、PYTHONPATH 等),可以通过过滤来获取:
# 获取与特定软件相关的环境变量(例如包含 "JAVA" 的变量)
for key, value in os.environ.items():if "JAVA" in key:print(f"{key}: {value}")
使用 os.environ.get 获取单个环境变量:
如果你知道具体的环境变量名称,可以直接获取:
# 获取特定环境变量
java_home = os.environ.get('JAVA_HOME')
print(f"JAVA_HOME: {java_home}")
将环境变量导出到当前会话:
如果需要在当前会话中设置新的环境变量,可以使用 os.environ:
# 设置新的环境变量
os.environ['MY_VAR'] = 'my_value'# 验证是否设置成功
print(os.environ.get('MY_VAR')) # 输出: my_value
使用 subprocess 查看环境变量:
如果需要从子进程中获取环境变量,可以使用 subprocess 模块:
import subprocess# 使用 `env` 命令列出所有环境变量(Linux/Mac)
result = subprocess.run(['env'], capture_output=True, text=True)
print(result.stdout)# 在 Windows 上可以使用 `set` 命令
# result = subprocess.run(['set'], capture_output=True, text=True)
# print(result.stdout)
保存环境变量到文件:
如果需要将所有环境变量保存到文件中,可以这样操作:
with open('env_vars.txt', 'w') as f:for key, value in os.environ.items():f.write(f"{key}: {value}\n")
(15)执行系统命令
# 执行系统命令
os.system('ls -l') # 在 Linux/Mac 上列出文件
os.system('dir') # 在 Windows 上列出文件
用magic或者是os模块
3,文件操作
其中最常用的模式字符串:主要是r以及w
参考:https://www.runoob.com/python/python-files-io.html
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
(1)写文件:
注意,只有close才能将文件内容写入,并呈现出来。
总之,open和close对应,只有在open后没有close前,才能正常写入文件;只有close之后,才能正常呈现正常写入的文件内容。
重点就是比较其中的write以及writelines:
主要区别
特性 | **write** | **writelines** |
---|---|---|
输入类型 | 单个字符串 | 字符串的可迭代对象(如列表、元组) |
写入方式 | 一次写入一个字符串 | 一次写入多个字符串 |
换行处理 | 需要手动添加换行符 | 需要手动在每个字符串中添加换行符 |
write顾名思义只能接受单个对象,writelines可以接受多个对象(字符串的可迭代对象)。
来个简单的例子:
上面的逻辑就是先写入字符内容,写完之后再判断字数有没有达到10个,10个一行,如果达到了就换行;
当然,我们也可以直接先判断是否达到10个一行的条件,如果达到了就输出字符以及换行符,否则正常打印:
import os
file1 = open("1000.txt","w")
for i in range(1,101):if i%10==0:file1.write(f"{i}\n")else:file1.write(f"{i}\t")
file1.close()
os.system("cat 1000.txt")
(2)读文件:
注意,要正常读取的话,还是要考虑close,或者文件对象的重新读取:
比如说对于文件对象file,我读取了前5个字符,如果没有close的话,我再接着读取出所有的内容,相当于是对剩下的file迭代内容进行读取。
在 Python 中,文件对象的 read() 方法是基于文件指针(file pointer)工作的。文件指针会随着每次读取操作而移动,因此第二次调用 read() 时,只能读取从上次读取结束位置到文件末尾的内容,而不是从文件开头重新读取。
文件指针的工作原理:
文件指针初始位置:当文件被打开时,文件指针默认位于文件的开头。
read(n) 的行为:
read(n) 会从当前文件指针的位置读取 n 个字符,并将文件指针移动到读取结束的位置。
read() 的行为:
如果不指定参数,read() 会从当前文件指针的位置读取到文件末尾。
一般麻烦的话,就直接多次打开文件对象进行读取:
总得来说:
或者将可迭代在读的过程中迭代,或者将读完的内容进行迭代
总之,文件IO操作基本操作如下:
# 写操作
# 最好就是使用writelines写入多个可迭代字符串对象
file = open("path_to_file_to_write","w")
file.writelines(["str1","str2","strn"]) # 所有的字符串内容# 读操作
# 最好是for循环读取,对每一个line对象分别操作
file = open("path_to_file_to_read","r")
for line in file:print(line,end="")# 或者是用readlines读出来,再
file_content = file.readlines()
# 因为file_content也是一个可迭代对象,可以对对其进行操作
参考:https://liaoxuefeng.com/books/python/io/file/index.html
with语句能够自动帮我们调用close方法,所以为了养成良好的习惯,我们都使用with:
其实都是赋值的逻辑,原本的赋值逻辑"="变成了现在的“with as”语句形式
file=open() ————> with open() as file
# 写操作
# 最好就是使用writelines写入多个可迭代字符串对象
with open("path_to_file_to_write","w") as file:file.writelines(["str1","str2","strn"]) # 所有的字符串内容# 读操作
# 最好是for循环读取,对每一个line对象分别操作
with open("path_to_file_to_read","r") as file:for line in file:print(line,end="")# 或者是用readlines读出来,再file_content = file.readlines()
# 因为file_content也是一个可迭代对象,可以对对其进行操作
二,csv文件处理
此处以csv文件代称任何简单字符分割的文件,比如说常见的csv、tsv(bed、txt、excel格式等本质都是前面)。
主要是base python中常用的就是csv模块,所以我们用csv文件操作指代任何更一般的分割符操作:
(1)csv写文件:
首先待写入的文件得有,得有一个待写入文件对象;
然后对于这个对象,我们要使用csv模块进行操作,将基本操作中的待写入文件对象转化为csv模块中的writer对象。
总之,因为我们要使用csv模块,所以我们得将基本文件对象转换为csv中的writer对象,或者是下面的read对象;
然后再使用writer对象的函数,比如说writerow,或者是下面reader对象的函数。
再然后和基本文件读写操作一样关上。
(打开文件,转化对象,开始写或者读,再关上——》打转写关)
# csv文件写操作
# 打转写关import csv
file = open("test.csv","w") #打
csv_writer = csv.writer(file) #转
csv_writer.writerows([["姓名","年龄","性别"],["小明",18,"男"],["小红",19,"女"]]) #写
# 注意写入的是1个可迭代对象,所以可以是1个列表,而每一个被迭代的元素是csv中的一行,所以也可以是一个列表
file.close() #关
同样的,我们写单个字符用writerow,如果是写入一个可迭代对象就writerows
(2)csv读文件
然后注意对于reader对象,实际上是没有read、readline、readlines等函数方法的,
所以实际上还是得使用for循环,取出每一个可迭代对象,
可以看出来读出来的每一个对象都是列表list
# 基本逻辑都是:
# 1,打开文件,如果是读csv文件,就open+r;如果是写csv文件,就open+w,按照前面文件基本读写模式
# 2,对打开的文件可操作对象进行转换(这样才方便使用对应csv对象中的实现方法)
# 3,writer写对象就用写方法,reader读对象就用读方法
# 4,读写完毕之后对于最初打开的文件可操作对象要关闭# 写:打转写关
import csv
file = open("path_to_csv_to_write.csv","w") #打
csv_writer = csv.writer(file) #转
csv_writer.writerows([1个可迭代对象]) #写
file.close() #关# 读:打转读关
import csv
file = open("path_to_csv_to_read.csv","r") #打
csv_reader = csv.reader(file) #转
for row in csv_reader:print(row) # 循环写,对csv中的每一行内容进行操作等
file.close() #关
同样的,养成with as的良好习惯,避免close操作的遗漏。
# 基本逻辑都是:
# 1,with操作打开文件,如果是读csv文件,就open+r;如果是写csv文件,就open+w,按照前面文件基本读写模式
# 2,对打开的文件可操作对象进行转换(这样才方便使用对应csv对象中的实现方法)
# 3,writer写对象就用写方法,reader读对象就用读方法
# 4,读写完毕之后对于最初打开的文件可操作对象要关闭# 写:with打转写
import csv
with open("path_to_csv_to_write.csv","w") as file: #with打csv_writer = csv.writer(file) #转csv_writer.writerows([1个可迭代对象]) #写# 读:with打转读
import csv
with open("path_to_csv_to_read.csv","r") as file: #with打csv_reader = csv.reader(file) #转for row in csv_reader:print(row) # 循环写,对csv中的每一行内容进行操作等
我们来总结一下上面的内容:
**在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。
**文件基本操作是:with打写、with打读;
涉及csv模块的:with打转写、with打转读
如果是读的话建议是for循环读。
另外注意一下encoding参数,即读写的文件编码格式即可,
参考:https://docs.python.org/3/library/codecs.html
二,异常和异常处理:
要熟悉debug中各种常见的报错error:
这一部分主要是积累debug经验,以及自己严谨规范写代码中的操作。
相关文章:

python3:文件与异常
本来这篇教程是打算在base python数据类型之后出的,但是计划赶不上变化,反正最后都要融会贯通,今日有时间、今天遇到了类似的问题,就今天做这一模块的整理,顺序不是重点。 参考我的上一篇博客:https://blo…...

【兽医电子处方软件】佳易王宠物医院电子处方管理系统:宠物医院诊所用什么软件?一键导入配方模板软件程序实操教程 #操作简单 #宠物医院软件下载安装
一、概述 软件试用版资源文件下载方法: 【进入头像主页第一篇文章最后 卡片按钮 可点击了解详细资料 或左上角本博客主页 右侧按钮了解具体资料信息】 本实例以 佳易王宠物医院电子处方管理系统软件 为例说明,其他版本可参考本实例。试用版软…...
centos7.x下,使用宝塔进行主从复制的原理和实践
操作原理: 一、主库配置 1.修改 MySQL 配置文件 # 编辑主库配置文件(路径根据实际系统可能不同) vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID,主库设置为 1 log-bin mysql-bin …...
langchain学习
无门槛免费申请OpenAI ChatGPT API搭建自己的ChatGPT聊天工具 https://nuowa.net/872 基本概念 LangChain 能解决大模型的两个痛点,包括模型接口复杂、输入长度受限离不开自己精心设计的模块。根据LangChain 的最新文档,目前在 LangChain 中一共有六大…...
从“听不懂”到“能对话”,声网AI让语音交互不再难用
人们谁懂啊!做智能客服系统的真的被传统语音机器整怕了!以前那些基于规则的 IVR 系统,“卡顿感” 拉满还总答非所问,用户说啥都像在对牛弹琴。不能打断、没有上下文、流程死板到离谱,动不动就来句 “请再说一遍”&…...
VSCode设置SSH免密登录
引言 2025年05月13日20:21:14 原来一直用的PyCharn来完成代码在远程服务器上的运行,但是PyCharm时不时同步代码会有问题。因此,尝试用VSCode来完成代码SSH远程运行。由于VSCode每次进行SSH连接的时候都要手动输入密码,为了解决这个问题在本…...
Windows Java gRPC 示例
gRPC是一个开源高性能远程过程调用(RPC)框架,因为这个框架最早是由Goolge开发的,这里的g 代表的也即是Google。 关于gRPC更多的概念介绍可以参考: gRPC 基本介绍 本篇快速介绍在Windows环境下使用 Java 语言如何实现 gRPC 的服务端和客户端调用。 1. 环境准备 JDK 21Ma…...

问题及解决02-处理后的图像在坐标轴外显示
一、问题 在使用matlab的appdesigner工具来设计界面,可以通过点击处理按钮来处理图像,并将处理后的图像显示在坐标轴上,但是图像超出了指定的坐标轴,即处理后的图像在坐标轴外显示。 问题图如下图所示。 原来的坐标轴如下图所…...

EasyX开发——绘制跟随鼠标移动的小球
游戏主循环: #include<graphics.h>int main() {initgraph(1280, 720);while (true){}return 0; } peekmessage函数:如果成功拉取到了消息,函数就会返回true,反之就会返回false 使用另外一个循环来不断地从消息队列当中拉取…...

【Qt开发】信号与槽
目录 1,信号与槽的介绍 2,信号与槽的运用 3,自定义信号 1,信号与槽的介绍 在Qt框架中,信号与槽机制是一种用于对象间通信的强大工具。它是在Qt中实现事件处理和回调函数的主要方法。 信号:窗口中&#x…...
APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)
APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)是一种基于供应链管理和约束理论的智能生产管理工具,旨在通过动态优化资源分配和生产流程,解决制造业中的复杂计划问题。以下是其核心要点解析&…...

使用聊天模型和提示模板构建一个简单的 LLM 应用程序
官方教程 官方案例 在上面的链接注册后,请确保设置您的环境变量以开始记录追踪 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在笔记本中,您可以使用以下命令设置它们 import getpass imp…...

探索 C++23 的 views::cartesian_product
文章目录 一、背景与动机二、基本概念与语法三、使用示例四、特点与优势五、性能与优化六、与 P2374R4 的关系七、编译器支持八、总结 C23 为我们带来了一系列令人兴奋的新特性,其中 views::cartesian_product 是一个非常实用且强大的功能,它允许我们轻…...

【docker】--镜像管理
文章目录 拉取镜像启动镜像为容器连接容器法一法二 保存镜像加载镜像镜像打标签移除镜像 拉取镜像 docker pull mysql:8.0.42启动镜像为容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 连接容器 法一 docker e…...
Stapi知识框架
一、Stapi 基础认知 1. 框架定位 自动化API开发框架:专注于快速生成RESTful API 约定优于配置:通过标准化约定减少样板代码 企业级应用支持:适合构建中大型API服务 代码生成导向:显著提升开发效率 2. 核心特性 自动CRUD端点…...
Hapi.js知识框架
一、Hapi.js 基础 1. 核心概念 企业级Node.js框架:由Walmart团队创建,现由社区维护 配置驱动:强调声明式配置而非中间件 插件架构:高度模块化设计 安全优先:内置安全最佳实践 丰富的生态系统:官方维护…...
Node.js 中的 URL 模块
一、URL 模块基础 1. 模块导入方式 // Node.js 方式 const url require(url);// ES 模块方式 (Node.js 14 或启用 ESM) import * as url from url; 2. 核心功能 解析 URL 字符串 格式化 URL 对象 URL 处理工具方法 WHATWG URL 标准实现 二、URL 解析与构建 1. 传统解…...
Java集合框架详解与使用场景示例
Java集合框架是Java标准库中一组用于存储和操作数据的接口和类。它提供了多种数据结构,每种数据结构都有其特定的用途和性能特点。在本文中,我们将详细介绍Java集合框架的主要组成部分:List、Set和Queue,并通过代码示例展示它们的…...

Ensemble Alignment Subspace Adaptation Method for Cross-Scene Classification
用于跨场景分类的集成对齐子空间自适应方法 摘要:本文提出了一种用于跨场景分类的集成对齐子空间自适应(EASA)方法,它可以解决同谱异物和异谱同物的问题。该算法将集成学习的思想与域自适应(DA)算法相结合…...

如何通过 Windows 图形界面找到 WSL 主目录
WSL(Windows Subsystem for Linux)是微软开发的一个软件层,用于在 Windows 11 或 10 上原生运行 Linux 二进制可执行文件。当你在 WSL 上安装一个 Linux 发行版时,它会在 Windows 内创建一个 Linux 环境,包括自己的文件系统和主目录。但是,如何通过 Windows 的图形文件资…...

深入 MySQL 查询优化器:Optimizer Trace 分析
目录 一、前言 二、参数详解 optimizer_trace optimizer_trace_features optimizer_trace_max_mem_size optimizer_trace_limit optimizer_trace_offset 三、Optimizer Trace join_preparation join_optimization condition_processing substitute_generated_column…...

每日一道leetcode
790. 多米诺和托米诺平铺 - 力扣(LeetCode) 题目 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。 给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返…...
FFmpeg在Android开发中的核心价值是什么?
FFmpeg 在 Android 开发中的核心价值主要体现在其强大的多媒体处理能力和灵活性上,尤其在音视频编解码、流媒体处理及跨平台兼容性方面具有不可替代的作用。以下是具体分析: --- 1. 强大的音视频编解码能力 - 支持广泛格式:FFmpeg 支持几乎所…...
C#进阶(1) ArrayList
前言 在我们进行了入门,基础,核心的学习后,我们已经学了相当多的知识了,不知道你现在对比打开入门时候的你,进步了多少。是否也能自己写一点简单的程序来作为小成就炫耀一下呢? 博主给你留的小项目你是否都有认真去复刻或者改进呢? 这些问题的答案只有你自己清楚。 …...
竞业禁止协议中AI技能限制的深度剖析
首席数据官高鹏律师团队 在当今科技飞速发展的时代,人工智能(AI)领域成为了商业竞争的关键战场。随着AI技术在各行业的广泛渗透,竞业禁止协议中涉及AI技能的限制条款愈发受到关注,其背后蕴含着复杂而关键的法律与商业…...
动态查找滚动容器(通用方案)
需求:点击置顶按钮返回页面的顶部,涉及产生滚动条的元素不唯一的情况,如果确定滚动元素的情况,直接元素.scrollTop 0 就实现置顶了 也是查了一段时间,这个方法很赞,递归寻找滚动元素 步骤 1:判…...

CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选-耀圣
CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选 在石油化工、沥青储运、食品加工等行业中,带颗粒高粘度介质与料浆的恒温输送面临着腐蚀、磨损、堵塞等多重挑战。普通阀门难以兼顾耐高温、强密封与耐腐蚀性,导致设…...
SpringBoot整合MyBatis-Plus:零XML实现高效CRUD
前言 作为一名开发者,数据库操作是我们日常工作中不可或缺的部分。传统的MyBatis虽然强大,但需要编写大量XML映射文件,这在快速开发的今天显得效率不足。MyBatis-Plus(简称MP)作为MyBatis的增强工具,在保留…...

python酒店健身俱乐部管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...

嵌入式开发学习(第二阶段 C语言基础)
综合案例《猜拳游戏》 需求: 本游戏是一款单机游戏,人机交互 规则: 需要双方出拳:石头、剪刀、布赢: 石头→剪刀剪刀→ 布布 →石头 两边出拳相等输: … 实现: 选择对手玩家出拳对手出拳判断胜…...