15. 文件操作
一、什么是文件
文件(file)通常是磁盘或固态硬盘上的一段已命名的存储区。它是指一组相关数据的有序集合。这个数据集合有一个名称,叫做文件名。文件名 是文件的唯一标识,以便用户识别和引用。文件名包括 3 个部分:文件路径 + 文件名主干 + 文件后缀名。所有的文件都通过流进行输入、输出操作。
二、文件的基本操作
在 Python 中,内置了文件(File)对象。在使用文本对象时,首先需要通过内置的 opern() 方法创建一个文件对象,然后通过该对象提供的方法向文件中写入内容,以其使用 close() 方法关闭文件。
2.1、创建和打开文件
在 Python 中,想要操作文件需要先创建或者打开指定的文件并创建文件对象,可以通过内置的 open() 函数来实现。open() 函数的定义如下:
open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file:要创建或打开的文件名称,需要使用单引号或双引号括起来。如果要打开的文件和当前文件在同一个目录下,那么直接写文件名即可,否则需要指定完整的路径。mode:可选参数,用于指定文件的打开模式。默认的打开模式为只读(r)模式。buffering:可选参数,用于指定读写文件的缓冲模式。值为 0 表示不缓存,值为 1 表示缓存。如果大于 1,则表示缓冲区的大小。默认为缓存模式。
mode 参数的参数值:
| 模式 | 含义 | 说明 |
|---|---|---|
| r | 以只读模式打开文件,文件的指针将会放在文件的开头 | 文件必须存在 |
| r+ | 打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(从文件头开始覆盖) | |
| rb | 以二进制的格式打开文件,并且采用只读模式。文件的指针将会放在文件的开头,一般用于非文本文件 | |
| rb+ | 以二进制的格式打开文件,并且采用读写模式。文件的指针将会放在文件的开头,一般用于非文本文件 | |
| w | 以只写模式打开文件 | 文件存在,则将其覆盖,否则创建新的文件 |
| w+ | 打开文件后,先清空所有内容,使其变为一个空的文件,对这个空文件有读写权限 | |
| wb | 以二进制的格式打开文件,并且采用只写模式。文件的指针将会放在文件的开头,一般用于非文本文件 | |
| wb+ | 以二进制的格式打开文件,并且采用读写模式。文件的指针将会放在文件的开头,一般用于非文本文件 | |
| a | 以追加模式打开一个文件 | 如果文件已存在,文件指针放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件 |
| a+ | 以读写模式打开文件 | |
| ab | 以二进制的格式打开文件,并且采用追加模式。文件的指针将会放在文件的开头,一般用于非文本文件 | |
| ab+ | 以二进制的格式打开文件,并且采用读写模式。文件的指针将会放在文件的开头,一般用于非文本文件 | |
| x | 独占模式创建文件 | 如果文件不存在则创建,存在则报错,并且只能写不能读 |
# open()函数返回一个对象,这个对象就代表了当前打开的文件
file_object = open("text.txt")
print(file)
在 windows 系统中使用路径时,可以用 / 代替 \,可以使用 \\ 进行转义,还可以使用原始字符串开代替。表示路径时,我们可以使用 .. 返回上一级目录,使用 ‘.’ 表示当前目录。如果目标文件距离当前文件比较远,此时可以使用绝对路径。绝对路径应该从磁盘的根目录开始书写。
# 使用/代替\
file_name = "./file/text.txt"# 使用\\进行转义
# file_name = ".\\file\\text.txt"# 使用原始字符串
# file_name = r".\file\text.txt"# open()函数返回一个对象,这个对象就代表了当前打开的文件
file_object = open(file_name)
print(file_object)
在默认情况下,使用 open() 函数打开一个不存在的文件会报以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt'
使用 open() 函数以写模式打开一个不存在的文件,Python 会先创建文件,然后再往里面写内容。如果要写入的文件所在目录不存在,就会报错。
FileNotFoundError: [Errno 2] No such file or directory: './files/data.txt'
2.2、文件的关闭
关闭文件后可以使用文件对象的 close() 方法。close() 方法先刷新缓冲区中还没有写入的信息,然后再关闭文件,这样可以将没有写入到文件的内容写入到文件中。在关闭文件后,便不能再进行写入操作。close() 方法的语法格式如下:
file_object.close()
在 Python 中可以使用 with 语句,从而实现在处理文件时,无论是否抛出异常,都能保证 with 语句执行完毕后关闭已经打开的文件。with 语句的基本语法如下:
with open(file_object) as 文件对象:# 在with语句中可以直接用文件对下个做文件操作# 此时这个文件只能在with中使用,一旦with结束这个文件对象会自动close
三、文件的读取
3.1、写入文件内容
在 Python 中,提供 open() 方法来向文件中写入内容。如果操作的是一个文本对象的话,则 write() 需要传递一个字符串作为参数。该方法可以分多次向文件中写入内容,写入完成以后,该方法会返回写入字符的个数。
file_object.write("文件内容") # 将指定的内容写到指定文件中
写入文件的前提是在打开文件时,指定模式为写模式或读写模式,否则将会报以下错误:
io.UnsupportedOperation: not writable
如果写入的文件乱码,可以在打开文件时指定编码格式。
在写入文件后,一定要调用 close() 方法关闭文件,否则写入的内容不会保存到文件中。这是因为当我们在写入文件内容时,操作系统不会立刻数据写入磁盘,而是先缓存起来,调用 close() 方法时,操作系统会保证把没有写入的数据全部写入到磁盘。
在向文件写入内容后,如果我们不想马上关闭,也可以调用文件对象提供的 flush() 方法,把缓冲区的数据写入文件,这样也能保证数据全部写入磁盘。
file_name = "text.txt"lines = ["滕王高阁临江渚,佩玉鸣鸾罢歌舞。\n","画栋朝飞南浦云,珠帘暮卷西山雨。\n","闲云潭影日悠悠,物换星移几度秋。\n","阁中帝子今何在?槛外长江空自流。\n"
]
try:with open(file_name,'w',encoding='utf-8') as file_object:# 向文件中写入内容:for line in lines:file_object.write(line)
except FileNotFoundError:print(f"{file_name}不存在!")
我们可以使用 writelines() 方法将列表中的内容一次写入到指定文件中。
file_object.writelines(list) # 将列表中的内容一次写入到指定文件中
file_name = "text.txt"lines = ["滕王高阁临江渚,佩玉鸣鸾罢歌舞。\n","画栋朝飞南浦云,珠帘暮卷西山雨。\n","闲云潭影日悠悠,物换星移几度秋。\n","阁中帝子今何在?槛外长江空自流。\n"
]
try:with open(file_name,'w',encoding='utf-8') as file_object:# 向文件中写入内容:file_object.writelines(lines)
except FileNotFoundError:print(f"{file_name}不存在!")
如果我们在 open() 函数以二进制的模式读写文件时,不能指定编码 encoding 参数,否则会报错。并且,我们要写入的内容必须是字节类型的数据。
file_name = "text.txt"lines = ["滕王高阁临江渚,佩玉鸣鸾罢歌舞。\n","画栋朝飞南浦云,珠帘暮卷西山雨。\n","闲云潭影日悠悠,物换星移几度秋。\n","阁中帝子今何在?槛外长江空自流。\n"
]
try:with open(file_name,'wb') as file_object:# 向文件中写入内容:for line in lines:file_object.write(line.encode("utf-8"))
except FileNotFoundError:print(f"{file_name}不存在!")
write() 和 writelines() 函数不会在字符串的末尾自动添加换行符,需要我们手动添加 \n。
3.2、读取文件内容
3.2.1、读取指定字符
文件对象提供 read() 方法读取指定个数的字符,语法格式如下:
file_object.read([size])
size 为可选参数,在文本模式下用来指定读取字符的个数。如果省略要读取字符的个数,则一次性读取所有内容。默认情况 read() 方法是一字节一字节的读取,效率比较低。在二进制模式下,用于指定读取的字节数。
读取文件的前提是在打开文件时,指定模式为读模式或读写模式,否则将会报以下错误:
io.UnsupportedOperation: not readable
file_name = "text.txt"try:with open(file_name,encoding="utf-8") as file_object:# 向文件中写入内容:content = file_object.read()print(content)
except FileNotFoundError:print(f"{file_name}不存在!")
read() 函数可以接收一个 size 作为参数,该参数用来指定要读取字符的数量。每一次读取都是从上一次读取到的位置开始读取的。如果字符的数量小于 size,则会读取剩余所有的字符。如果已经读取到文件的末尾,则会返回空串。
file_name = "text.txt"try:with open(file_name,encoding="utf-8") as file_object:# 定义一个变量指定每次读取的大小size = 8# 创建一个循环读取文件内容while True:content = file_object.read(size)if not content:# 内容读取完毕,退出循环break# 向文件中写入内容:print(content,end='')print()
except FileNotFoundError:print(f"{file_name}不存在!")
如果我们在 open() 函数以二进制的模式读写文件时,不能指定编码 encoding 参数,否则会报错。
file_name = "text.txt"try:with open(file_name,mode="rb") as file_object:# 向文件中写入内容:content = file_object.read()print(content.decode("utf-8"))
except FileNotFoundError:print(f"{file_name}不存在!")
使用 read() 方法读取文件时,是从文件的开头开始的。如果想要读取部分内容,可以先使用文件对象的 seek() 方法将文件的指针移动到新位置,然后再应用 read() 方法读取。
3.2.1、读取一行
Python 中还提供了 readline() 方法用于每次读取一行数据。
file_object.readline() # 读取一行
file_name = "text.txt"try:with open(file_name,encoding="utf-8") as file_object:while True:content = file_object.readline()if not content:breakprint(content,end='')print()
except FileNotFoundError:print(f"{file_name}不存在!")
3.2.2、读取全部行
Python 中还提供 readlines() 方法用于读取全部行。该方法返回的是一个字符串列表,每个元素为文件的一行内容。
file_object.readlines() # 读取全部行,结果保存在列表中
file_name = "text.txt"try:with open(file_name,encoding="utf-8") as file_object:list = file_object.readlines()for item in list:print(item,end='')print()
except FileNotFoundError:print(f"{file_name}不存在!")
四、文件的定位
我们可以用 seek() 函数修改文件指针的位置。
file_object.seek(offset[,whence]) # 用来修改当前读取的位置
- offsets:在文本模式下用于指定字节的个数,其具体位置与 whence 有关;
- whence:用于指定从什么位置开始计算。值为 0 表示从头开始计算,值 1 表示当前位置开始计算,值 2 表示从文件尾开始计算。默认值为 0;
如果参照物是文件末尾位置,应该倒着移动;
只有 whence=0 可以在文本模式下使用;
我们还可以使用 tell() 函数查看当前读取的位置。
file_object.tell() # 用来查看当前读取的位置
file_name = "text.txt"try:with open(file_name,encoding="utf-8") as file_object:file.seek(30)print(file_object.tell())content = file_object.readline()print(content)
except FileNotFoundError:print(f"{file_name}不存在!")
五、目录与文件其它操作
目录也称文件夹,用于分层保存文件。通过目录可以分别识别地存放文件。我们可以通过目录快速找到想要的文件。在 Python 中,并没有提供直接操作目录的函数或者对象,而是需要使用内置的 os 和 os.path 模块实现。
os 模块提供与目录相关的函数:
os.getcwd() # 返回当前工作目录
os.listdir(path) # 返回指定目录下的文件和目录信息
os.mkdir(path[,mode]) # 创建目录
os.makedirs(path1/path2...[,mode]) # 创建多级目录
os.rmdir(path) # 删除目录
os.removedirs(path1/path2...) # 删除多级目录
os.chdir(path) # 把path设置为当前工作目录
os.walk(top[,topdown[,onerror]]) # 遍历目录,返回一个元组,包括所有路径名、所有目录列表和文件列表3个元素
os.path 模块提供的与目录相关的函数:
os.path.abspath(path) # 用于获取文件或目录的绝对路径
os.path.exists(path) # 用于判断目录或者文件是否存在,如果存在则返回True,否则返回False
os.path.join(path,name) # 将目录与目录或者文件名拼接起来
os.path.splitext() # 分离文件名和扩展名
os.path.basename(path) # 从一个目录中提取文件名
os.path.dirname(path) # 从一个路径中提取文件路径,不包含文件名
os.path.isdir(path) # 用于判断是否为有效路径
os.path.getsize(path) # 获取文件或文件夹的大小,单位为字节
os 模块提供的与文件相关的函数:
os.access(path,accessmode) # 获取对文件是否有指定访问权限
os.chmod(path,mode) # 修改path指定文件的访问权限
os.remove(paht) # 删除path指定的文件路径
os.rename(src,dst) # 将文件或目录src重名为dst
os.stat(path) # 返回path指定文件的信息
os.startfile(path[,operation]) # 使用关联的应用程序打开path指定的文件
import ospath = os.path.join("db","demo","xxx.txt") # 路径的拼接
print(f"文件的路径:{path}")parent_directory = os.path.dirname(path) # 获取上级目录
print(f"文件的父目录:{parent_directory}")is_exist = os.path.exists(parent_directory)
if not is_exist:os.makedirs(parent_directory) # 创建文件夹absolute_path = os.path.abspath(path) # 获取绝对路径
print(f"文件的绝对路径:{absolute_path}")with open(absolute_path,mode="w",encoding="utf-8") as f:f.write("落霞与孤鹜齐飞,秋水共长天一色。")grand_parent = os.path.dirname(parent_directory)
print(f"祖父文件夹:{grand_parent}")file_list = os.listdir(grand_parent) # 查看目录下的文件或一级文件夹
print(f"祖父文件夹下的文件和一级目录:{file_list}")file_generate = os.walk(grand_parent) # 查看目录下的所有文件,返回的是一个生成器
for base_dir,folder_list,file_list in file_generate:print(f"base_dir = {base_dir}, folder_list = {folder_list}, file_list = {file_list}")for name in file_list:file_path = os.path.join(base_dir,name)print(f"祖父文件夹下的文件和目录:{file_path}")os.remove(absolute_path) # 删除文件
相关文章:
15. 文件操作
一、什么是文件 文件(file)通常是磁盘或固态硬盘上的一段已命名的存储区。它是指一组相关数据的有序集合。这个数据集合有一个名称,叫做文件名。文件名 是文件的唯一标识,以便用户识别和引用。文件名包括 3 个部分:文件…...
清风数学建模学习笔记——Topsis法
数模评价类(2)——Topsis法 概述 Topsis:Technique for Order Preference by Similarity to Ideal Solution 也称优劣解距离法,该方法的基本思想是,通过计算每个备选方案与理想解和负理想解之间的距离,从而评估每个…...
组合总和习题分析
习题:(leetcode39) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 c…...
基于eFramework车控车设中间件介绍
车设的发展,起源于汽车工业萌芽之初,经历了机械式操作的原始粗犷,到电子式调控技术的巨大飞跃,到如今智能化座舱普及,远程车控已然成为汽车标配,车设功能选项也呈现出爆发式增长,渐趋多元繁杂。…...
L17.【LeetCode笔记】另一棵树的子树
目录 1.题目 代码模板 2.分析 3.代码 4.提交结果 1.题目 https://leetcode.cn/problems/subtree-of-another-tree/description/ 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ÿ…...
BGP通过route-policy路由策略调用ip-prefix网络前缀实现负载均衡与可靠性之AS-path属性
一、实验场景 1、loopback0与loopback1模拟企业实际环境中的某个网段。 2、本例目标总公司AR3的1.1.1.1/32网段到分公司AR4的3.3.3.3/32的流量从上方的AS500自治系统走。 3、本例目标总公司AR3的4.4.4.4/32网段到分公司AR4的2.2.2.2/32的流量从下面的AS300、AS400自治系统走。…...
每日速记10道java面试题14-MySQL篇
其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 每日速记10道java面试题04-CSDN博客 每日速记10道java面试题05-CSDN博客 每日速记10道java面试题06-CSDN博客 每日速记10道java面试题07-CSDN博客 每…...
内存图及其画法
所有的文件都存在硬盘上,首次使用的时候才会进入内存 进程:有自己的Main方法,并且依赖自己Main运行起来的程序。独占一块内存区域,互不干扰。内存中有一个一个的进程。 操作系统只认识c语言。操作系统调度驱动管理硬件࿰…...
Ansys Maxwell:Qi 无线充电组件
Qi 无线充电采用感应充电技术,无需物理连接器或电缆,即可将电力从充电站传输到兼容设备。由 WPC 管理的 Qi 标准确保了不同无线充电产品之间的互操作性。以下是 Qi v1.3 标准的核心功能: Qi v1.3 标准的主要特点 身份验证:确保充…...
【Shell 脚本实现 HTTP 请求的接收、解析、处理逻辑】
以下是一个实现客户端对 Shell HTTP 服务发起 POST 请求并传入 JSON 参数的完整示例。Shell 服务会解析收到的 JSON 数据,根据内容执行操作。 服务端脚本:http_server.sh 以下脚本使用 netcat (nc) 来监听 HTTP 请求,并通过 jq 工具解析 JSO…...
【北京迅为】iTOP-4412全能版使用手册-第六十七章 USB鼠标驱动详解
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...
【青牛科技】拥有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作——D4558
概述: D4558内部包括有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作。该电路具有电压增益高、噪声低等特点。主要应用于音频信号放大,有源滤波器等场合。 D4558采用DIP8、SOP8的封装形式 主要特点ÿ…...
Kafka 数据写入问题
目录标题 分析思路1. **生产者配置问题**:Kafka生产者的配置参数生产者和消费者的处理确定并优化 2. **网络问题**:3. **Kafka 集群配置问题**:unclean.leader.election.enable 4. **Zookeeper 配置问题**:5. **JVM 参数调优**&am…...
实战ansible-playbook(九)-profile配置- 确保 CUDA 和 MPI 环境变量正确设置并立即生效
Playbook 分析 --- - name: 确保 CUDA 和 MPI 环境变量正确设置并立即生效hosts: pod2 # 指定目标主机组或具体主机名become: yes # 使用特权提升(sudo),以root权限执行某些需要权限的任务remote_user: canopy # 远程连接使用的用户名vars: # 定义全局变量,用于Playbo…...
气膜馆:科技与环保融合的未来建筑新选择—轻空间
在全球城市化进程不断加快的背景下,传统建筑方式面临着越来越多的挑战。如何在有限的土地和资源条件下,快速、高效、环保地搭建符合多功能需求的建筑,成为现代建筑行业亟待解决的重要课题。而随着科技的进步与建筑材料的创新,一种…...
git回退到某个版本git checkout和git reset命令的区别
文章目录 1. git checkout <commit>2. git reset --hard <commit>两者的区别总结推荐使用场景* 在使用 Git 回退到某个版本时, git checkout <commit> 和 git reset --hard <commit> 是两种常见的方式,但它们的用途和影响有很…...
Preprocess
Preprocess数据预处理 文本 使用Tokenizer将文本转换为标记序列,创建标记的数值表示,并将它们组装成张量。 预处理文本数据的主要工具是标记器。标记器根据一组规则将文本拆分为标记。标记被转换为数字,然后转换为张量,这些张量…...
stm32 spi接口传输asm330l速率优化(及cpu和dma方式对比)
最近一段时间做了一个mems的项目,项目的方案是stm32g071做主控,读写3颗asm330l的硬件形态。最初是想放置4颗imu芯片,因为pcb空间布局的问题,改放了3颗。但对于软件方案来说无所谓,关键是如何优化spi的传输速率…...
数字时代的文化宝库:存储技术与精神生活
文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库:存储技术与精神生活 在数字化的浪潮中,存储技术如同一座桥梁,连接着过去与未来,承载着人类文明的瑰宝。随着存储容量的不断增…...
flex: 1 display:flex 导致的宽度失效问题
flex: 1 & display:flex 导致的宽度失效问题 问题复现 有这样的一个业务场景,详情项每行三项分别占33%宽度,每项有label字数不固定所以宽度不固定,还有content 占满标签剩余宽度,文字过多显示省略号, 鼠标划入展示…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
