Python读取excel数据并创建文件目录树-全解析过程及逻辑

需求描述:

需要将以下excel内的结构解析,并创建对应的文件目录
在这里插入图片描述

实现思路:

实现思路是通过解析Excel文件中的目录结构,并根据目录结构创建对应的文件夹。

具体的实现步骤如下:

1. 加载指定的Excel文件,获取活动的工作表。
2. 创建一个空的目录栈列表,用于记录当前每一级目录。
3. 遍历工作表中的每一行,从第2行开始。
4. 对于每一行,获取当前行的目录级别。
5. 遍历当前行的每一个单元格,判断是否是目录名。
6. 如果单元格的值不为None且不为"@",则将其作为目录名进行处理。
7. 清空目录栈中当前行级别及以下的目录,以保持目录栈的正确层级关系。
8. 将当前目录名加入目录栈。
9. 根据目录栈中的目录名构建完整的目录路径。
10. 使用函数创建目录,如果目录已存在则忽略。
11. 重复步骤3至步骤10,直到遍历完所有行。
12. 完成目录的创建。

那么,怎么去理解目录栈呢?

当我们遍历Excel文件的每一行时,我们需要记录当前的目录结构。目录栈就像是一个容器,用来存储目录的层级关系。

假设Excel文件中的目录结构是这样的:

目录A目录B目录C目录D目录E目录F

我们可以使用一个列表来表示目录栈,开始时是一个空列表 []
当我们遍历到第一行时,目录栈为空,我们将目录A加入目录栈中,目录栈变为 ['目录A']
当我们遍历到第二行时,目录栈中已经有了目录A,我们需要将目录B加入目录栈中,所以目录栈变为 ['目录A', '目录B']
当我们遍历到第三行时,目录栈中已经有了目录A和目录B,我们需要将目录C加入目录栈中,所以目录栈变为 ['目录A', '目录B', '目录C']
当我们遍历到第四行时,目录栈中已经有了目录A,我们需要将目录D加入目录栈中,但同时我们需要清空目录栈中目录B和目录C以下的内容,所以目录栈变为 ['目录A', '目录D']
当我们遍历到第五行时,目录栈中已经有了目录A和目录D,我们需要将目录E加入目录栈中,所以目录栈变为 ['目录A', '目录D', '目录E']
当我们遍历到第六行时,目录栈中已经有了目录A、目录D和目录E,我们需要将目录F加入目录栈中,所以目录栈变为 ['目录A', '目录D', '目录E', '目录F']
通过这样的方式,我们使用列表来模拟目录栈的结构,每当遍历到一个新的目录时,我们将其加入目录栈中,并且可以根据需要清空目录栈中的部分内容,以保持正确的目录层级关系。

实现代码:

import openpyxl
import osdef parse_excel(file_path):workbook = openpyxl.load_workbook(file_path)sheet = workbook.activedirectory_stack = []  # 用于记录当前每一级目录的栈for row in sheet.iter_rows(min_row=2, values_only=True):level = len(directory_stack)  # 当前行的目录级别for i, cell_value in enumerate(row):if cell_value is not None and cell_value != "@":directory_stack = directory_stack[:i]  # 清空目录栈中当前行级别及以下的目录directory_stack.append(cell_value)  # 将当前目录加入目录栈directory_path = "\\".join(directory_stack)  # 构建完整的目录路径full_path = file_path.replace(os.path.basename(file_path), "") + directory_pathos.makedirs(full_path, exist_ok=True)  # 创建目录,如果目录已存在则忽略parse_excel("E:\TEST\文件.xlsx")

代码逻辑:

当我们调用 parse_excel(“E:\TEST\文件.xlsx”) 时,会执行 parse_excel 函数。

在 parse_excel 函数中,首先通过 openpyxl.load_workbook(file_path) 加载指定的 Excel 文件,并将其赋值给 workbook 变量。

然后,通过 workbook.active 获取活动的工作表,并将其赋值给 sheet 变量。

接下来,我们创建一个空列表 directory_stack,用于记录当前每一级目录的栈。

然后,通过遍历 sheet 中的每一行(从第2行开始),我们逐行解析 Excel 文件中的目录结构。

对于每一行,我们首先获取当前行的目录级别,即目录栈 directory_stack 的长度。

然后,我们遍历当前行的每一个单元格,判断单元格的值是否不为 None 且不为 “@”。

如果满足条件,说明该单元格是一个目录名,我们需要对目录栈进行相应的操作。

首先,我们使用 directory_stack = directory_stack[:i] 清空目录栈中当前行级别及以下的目录,这样就保证目录栈中只保留了当前行级别之前的目录。

然后,我们将当前目录加入目录栈,使用 directory_stack.append(cell_value)。

接着,我们根据目录栈中的目录名,构建完整的目录路径。

通过 “\”.join(directory_stack),我们使用反斜杠将目录栈中的目录名连接起来,得到一个完整的目录路径。

最后,我们使用 os.makedirs(full_path, exist_ok=True) 创建目录,如果目录已存在则忽略。

通过这样的逻辑,我们可以根据 Excel 文件中的目录结构,逐行解析并创建对应的文件夹。每一行代表一个目录,每一列代表目录的级别。代码会根据目录的层级关系,构建目录栈,并根据目录栈构建完整的目录路径,最终使用 os.makedirs 函数创建目录。

最终效果图(部分):

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人驾驶实战-第十二课(强化学习自动驾驶系统)(完)

在七月算法上报了《无人驾驶实战》课程,老师讲的真好。好记性不如烂笔头,记录一下学习内容。 课程入口,感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 强化学习&#xff…

Vite 创建 Vue项目之后,eslint 错误提示的处理

使用 npm create vuelatest创建 vue 项目(TS)之后,出现了一些 eslint 错误提示,显然,不是代码真实的错误,而是提示搞错了。 vuejs/create-vue: 🛠️ The recommended way to start a Vite-pow…

Spring Boot集成EasyExcel实现excel导入导出操作

文章目录 Spring Boot集成EasyExcel实现excel导入导出操作0 简要说明简单使用读操作excel源文件实体类监听器业务代码 写操作*实体类*excel示例业务代码根据参数指定列导出指定哪几列导出复杂头导出 关于数值型,日期型,浮点型数据解决方案实体类接收字符…

【计算机视觉】关于图像处理的一些基本操作

目录 图像平滑滤波处理均值滤波计算过程python实现 高斯滤波计算过程python实现 中值滤波计算过程python实现 图像的边缘检测Robert算子计算过程python实现 图像处理腐蚀算子计算过程python实现 Hog(梯度方向直方图)特征计算流程:Hog的特征维…

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注…

计算机基础知识一

1、计算机系统组成 1.1 硬件 CPU:中央处理器、计算机核心部件、负责计算任务 内存:记忆功能、存储二进制数,内存是一个字节一个地址。 内存大小换算: 8 bits 1 Byte 1024 Bytes Bytes 1 KB , 1024 KB KB 1 …

【安装部署】Mysql下载及其安装的详细步骤

1.下载压缩包 官网地址:www.mysql.com 2.环境配置 1.先解压压缩包 2.配置环境变量 添加环境变量:我的电脑--->属性-->高级-->环境变量-->系统变量-->path 3.在mysql安装目录下新建my.ini文件并,编辑my.ini文件 编辑内容如…

nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件

特性: 1、支持任意深度的chm文件解析 2、解析后内容结构转换为tree数据呈现 3、点击树节点可以在html实时查看数据 4、不依赖任何浏览器端插件,兼容性较好 nodejs端核心代码 const $g = global.SG.$g, fs = global.SG.fs, router = global.SG.router, xlsx = global.SG.xl…

关于丢失安卓秘钥的撞sha-1值的办法

实验得知,安卓sha-1和keytool生成秘钥签名文件的时间有关。 前提条件是,开发者必须知道生成秘钥的所有细节参数 以下是撞文件代码(重复生成) import time import osidx 0while True:cmdkeytool -keyalg RSA -genkeypair -alia…

FFmpeg安装和使用

sudo apt install ffmpeg sudo apt-get install libavfilter-devcmakelist模板 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(ffmpeg_demo)# 设置ffmpeg依赖库及头文件所在目录,并存进指定变量 set(ffmpeg_libs_DIR /usr/lib/x86_64-linux-gnu) …

C++的六大“天选之子“拷贝构造与与运算符重载

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 &#x1f…

Vue 中使用 WebWorker

目录 安装 loader 应用场景 打包时错误处理 安装 loader npm install worker-loader -D 如果直接把worker.js放到public目录下,则不需要安装loader vue.config.js const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDe…