当前位置: 首页 > article >正文

别再被FileExistsError坑了!Python os.mkdir() 创建文件夹的3个实用技巧(附YOLO数据转换实战)

别再被FileExistsError坑了Python os.mkdir() 创建文件夹的3个实用技巧附YOLO数据转换实战在计算机视觉项目的开发过程中数据预处理环节往往占据大量时间。特别是当我们需要将标注数据从Labelme格式转换为YOLO格式时频繁的文件操作和目录创建是不可避免的。这时FileExistsError就像一个不期而遇的老朋友总是在最不合时宜的时候打断我们的工作流程。想象一下这样的场景你正在处理一个包含上千张葡萄图像的数据集脚本运行到一半突然抛出FileExistsError: [WinError 183]错误仅仅因为目标文件夹已经存在。这不仅打断了工作流程还可能导致数据转换不完整。更糟糕的是如果你没有妥善处理这个异常整个脚本可能直接崩溃让你不得不从头开始。1. 理解FileExistsError的根源FileExistsError是Python中一个常见的异常类型当尝试创建一个已经存在的文件或目录时就会触发。在Windows系统上这个错误通常伴随着[WinError 183]的错误代码而在Linux/macOS上则显示为[Errno 17]。1.1 为什么os.mkdir()会抛出这个错误os.mkdir()是Python标准库中用于创建单个目录的函数。它的设计哲学是显式优于隐式——如果目录已经存在它不会默默地跳过而是明确地告诉你这个操作有问题。这种设计有助于开发者及早发现潜在的问题。import os # 第一次创建目录 - 成功 os.mkdir(experiment_data) # 第二次尝试创建同名目录 - 抛出FileExistsError os.mkdir(experiment_data) # 这里会报错1.2 与类似错误的区别初学者有时会混淆FileExistsError和其他几个类似的错误错误类型触发条件典型错误代码FileExistsError尝试创建已存在的文件/目录WinError 183 / Errno 17FileNotFoundError尝试访问不存在的文件/目录WinError 2 / Errno 2PermissionError没有足够的权限执行操作WinError 5 / Errno 13理解这些区别有助于我们更准确地处理不同类型的文件系统异常。2. 三种防御性编程技巧2.1 方法一先检查再创建最直观的解决方案是在创建目录前先检查它是否存在。Python的os.path.exists()函数非常适合这个任务。import os def safe_mkdir(path): if not os.path.exists(path): os.mkdir(path) print(f目录 {path} 创建成功) else: print(f目录 {path} 已存在跳过创建) # 使用示例 safe_mkdir(labels)这种方法的特点优点逻辑简单明了容易理解缺点存在竞态条件风险在检查存在和实际创建之间其他进程可能已经创建了目录适用场景单线程环境或对并发要求不高的脚本2.2 方法二使用os.makedirs()的exist_ok参数Python 3.2引入了os.makedirs()函数的exist_ok参数这是处理目录创建最优雅的方式之一。import os # 创建单层目录类似于os.mkdir os.makedirs(labels, exist_okTrue) # 创建多层目录 os.makedirs(labels/train/images, exist_okTrue)参数说明exist_okFalse默认如果目录存在则抛出FileExistsErrorexist_okTrue目录存在时静默跳过性能对比方法执行时间(μs)内存占用(KB)线程安全os.mkdir 检查45.21.2否os.makedirs(exist_okTrue)38.71.1是2.3 方法三异常处理与重试机制对于需要更高鲁棒性的应用可以结合异常处理和重试机制。import os import time import random def robust_mkdir(path, max_retries3): for attempt in range(max_retries): try: os.makedirs(path, exist_okFalse) return True except FileExistsError: if attempt max_retries - 1: raise wait_time random.uniform(0.1, 0.5) time.sleep(wait_time) return False # 使用示例 try: robust_mkdir(labels) except FileExistsError: print(目录已存在所有重试尝试均失败)这种方法特别适合以下场景分布式系统中多个进程可能同时尝试创建相同目录需要确保目录确实被当前进程创建成功对可靠性要求极高的生产环境3. YOLO数据转换实战应用让我们将这些技巧应用到一个实际的Labelme转YOLO格式的脚本中。假设我们有一个葡萄图像数据集需要将Labelme的JSON标注转换为YOLO格式的TXT文件。3.1 改进后的目录创建逻辑import os import json from tqdm import tqdm def convert_labelme_to_yolo(labelme_dir, output_dir): # 安全创建输出目录结构 os.makedirs(os.path.join(output_dir, labels, train), exist_okTrue) os.makedirs(os.path.join(output_dir, labels, val), exist_okTrue) os.makedirs(os.path.join(output_dir, labels, test), exist_okTrue) # 处理每个JSON文件 for json_file in tqdm(os.listdir(labelme_dir)): if not json_file.endswith(.json): continue json_path os.path.join(labelme_dir, json_file) with open(json_path, r) as f: data json.load(f) # 转换逻辑简化版 txt_content [] for shape in data[shapes]: if shape[shape_type] rectangle: # 计算YOLO格式的归一化坐标 # [...省略具体转换代码...] txt_content.append(f{class_id} {x_center} {y_center} {width} {height}) # 写入TXT文件 txt_filename os.path.splitext(json_file)[0] .txt txt_path os.path.join(output_dir, labels, train, txt_filename) with open(txt_path, w) as f: f.write(\n.join(txt_content)) # 使用示例 convert_labelme_to_yolo(labelme_annotations, yolo_dataset)3.2 处理特殊情况在实际项目中我们可能还需要考虑以下特殊情况符号链接使用os.path.islink()检查路径是否为符号链接只读文件系统捕获PermissionError并提供有意义的错误信息磁盘空间不足捕获OSError并检查errno属性def super_robust_mkdir(path): try: os.makedirs(path, exist_okTrue) except PermissionError: print(f错误没有权限创建目录 {path}) return False except OSError as e: if e.errno 28: # No space left on device print(错误磁盘空间不足) return False raise return True4. 高级技巧与最佳实践4.1 临时目录处理使用Python的tempfile模块可以更安全地处理临时目录import tempfile import shutil with tempfile.TemporaryDirectory() as temp_dir: print(f临时目录创建于: {temp_dir}) # 在这里使用临时目录 # ... # 退出with块后自动清理4.2 目录权限控制在创建目录时你可能需要设置特定的权限import os import stat os.makedirs(private_data, modestat.S_IRWXU) # 仅所有者有读写执行权限常用权限标志stat.S_IRWXU: 所有者读、写、执行stat.S_IRWXG: 组用户读、写、执行stat.S_IROTH: 其他用户只读4.3 跨平台兼容性确保你的代码在不同操作系统上都能正常工作import os import platform def get_safe_path(path): if platform.system() Windows: # 处理Windows下的路径问题 return path.replace(/, \\) else: return path4.4 性能优化当需要创建大量目录时可以考虑以下优化from concurrent.futures import ThreadPoolExecutor def batch_create_dirs(dir_list): with ThreadPoolExecutor() as executor: executor.map(lambda d: os.makedirs(d, exist_okTrue), dir_list)在数据处理流程中稳健的文件操作是保证整个流程可靠性的基础。特别是在计算机视觉项目中一个简单的FileExistsError可能导致数小时的数据处理工作前功尽弃。通过本文介绍的这些技巧你可以构建出更加健壮、容错性更强的数据处理流程。

相关文章:

别再被FileExistsError坑了!Python os.mkdir() 创建文件夹的3个实用技巧(附YOLO数据转换实战)

别再被FileExistsError坑了!Python os.mkdir() 创建文件夹的3个实用技巧(附YOLO数据转换实战) 在计算机视觉项目的开发过程中,数据预处理环节往往占据大量时间。特别是当我们需要将标注数据从Labelme格式转换为YOLO格式时&#x…...

多智能体任务编排框架:从原理到实践,构建复杂AI工作流

1. 项目概述:一个面向复杂任务编排的多智能体管理器最近在折腾AI智能体应用开发的朋友,可能都遇到过类似的困境:单个智能体(Agent)能力有限,处理稍微复杂一点的业务流程,比如一个完整的客户服务…...

真空度多少最合适?真空脱泡搅拌机参数解析

真空脱泡搅拌机真空度:核心参数与工艺应用全解析在电子封装、新能源材料、精密化工、复合材料等高端制造领域,壹壹真空脱泡搅拌机已成为物料均质混合与气泡去除的核心设备。而真空度作为设备的核心技术指标,直接决定脱泡彻底性、物料处理质量…...

NVIDIA Nemotron Nano V2 VL架构与4bit量化技术解析

1. NVIDIA Nemotron Nano V2 VL架构解析NVIDIA Nemotron Nano V2 VL作为当前最先进的视觉语言模型之一,其架构设计体现了多模态融合的前沿思想。该模型基于12B参数的Nemotron-Nano-V2 LLM构建,通过创新的跨模态注意力机制实现视觉与语言特征的深度融合。…...

别再让服务器‘卡脖子’了!手把手教你用numactl优化NUMA架构下的应用性能

别再让服务器“卡脖子”!NUMA架构性能调优实战指南 凌晨三点,数据库突然响应延迟飙升到800毫秒,监控大屏一片血红——这可能是每个运维工程师的噩梦。当你的应用在高配服务器上表现反常时,NUMA架构的内存访问问题很可能是罪魁祸首…...

3分钟掌握Blender MMD Tools:从零开始导入MMD模型的终极指南

3分钟掌握Blender MMD Tools:从零开始导入MMD模型的终极指南 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …...

中国DevOps平台选型全景报告:技术适配与效能跃升的关键抉择

随着数字化转型进入深水区,中国企业DevOps平台选型正面临前所未有的复杂性挑战。2026年的技术环境中,基础功能完备性已不再是唯一考量,本土化适配深度、安全可控能力与行业特性匹配度正成为企业技术决策的关键维度。这份报告通过深入分析主流…...

别再让PlatformNotSupportedException搞垮你的跨平台.NET应用:5个实战避坑技巧

别再让PlatformNotSupportedException搞垮你的跨平台.NET应用:5个实战避坑技巧 当你的.NET应用在Linux服务器上突然崩溃,或者在macOS开发机上抛出神秘异常时,PlatformNotSupportedException往往是最令人头疼的"刺客"。这个看似简单…...

如何5分钟实现GitHub界面完整汉化:开发者必备的高效本地化方案

如何5分钟实现GitHub界面完整汉化:开发者必备的高效本地化方案 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 对于中文开…...

掌握本地化AI视频字幕提取:隐私安全与高效并重的终极解决方案

掌握本地化AI视频字幕提取:隐私安全与高效并重的终极解决方案 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、…...

嵌入式人脸识别:Person Sensor模块开发实战

1. 项目概述在嵌入式开发中集成人脸识别功能一直是个令人头疼的问题。传统方案要么需要昂贵的专用硬件,要么得从零开始训练机器学习模型,对开发者门槛要求较高。最近我在一个智能门铃项目中尝试了Useful Sensors公司推出的Person Sensor模块,…...

扩散模型优化:GAS框架提升生成质量与效率

1. 项目背景与核心价值在生成式模型的迭代优化过程中,扩散模型因其出色的生成质量成为当前研究热点。传统扩散模型通过模拟连续时间域中的随机微分方程(SDE)或常微分方程(ODE)来实现数据分布转换,但面临两个…...

ADE-CoT图像编辑优化:细节增强与上下文感知技术解析

1. 图像编辑优化策略概述在数字图像处理领域,编辑优化一直是核心挑战。传统方法往往面临效率与质量难以兼顾的困境,要么处理速度慢,要么输出效果不理想。ADE-CoT(Adaptive Detail Enhancement with Context-aware Optimization&am…...

Modbus RTU通信避坑指南:从零封装你的CRC校验函数(附可直接调用的C代码)

Modbus RTU通信避坑指南:从零封装你的CRC校验函数(附可直接调用的C代码) 当RS-485硬件调试完成后,真正的挑战才刚刚开始。我曾在一个工业自动化项目中,花了整整三天时间排查为什么Modbus RTU通信总是失败——硬件线路正…...

解析之C++的列表初始化语法

聚合初始化先从std::array的内部实现说起。为了让std::array表现得像原生数组,C中的std::array与其他STL容器有很大区别——std::array没有定义任何构造函数,而且所有内部数据成员都是public的。这使得std::array成为一个聚合(aggregate&…...

FakeLocation:Android应用级虚拟定位完全指南

FakeLocation:Android应用级虚拟定位完全指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在Android开发测试和隐私保护领域,精准的位置模拟一直是一个…...

Fast-GitHub终极指南:一键解决国内GitHub访问慢的免费浏览器插件

Fast-GitHub终极指南:一键解决国内GitHub访问慢的免费浏览器插件 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于国…...

Hermes Agent 源代码解析(一):根目录探秘,看懂 AI 代理的「公司级」架构设计

目录 Hermes Agent 源代码解析(一):根目录探秘,看懂 AI 代理的「公司级」架构设计 一、先搞懂:Hermes Agent 到底是什么? 二、可视化总览:Hermes Agent 公司架构图 三、根目录全解析&#x…...

OpenClaw 保姆级教程:你要知道的都在这里了!

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...

从审批流到组织架构:用AntV X6 1.x 在Vue里打造一个可交互的业务图表

从审批流到组织架构:用AntV X6 1.x 在Vue里打造可交互的业务图表 当我们需要在后台管理系统中实现复杂的业务流程可视化时,简单的静态图表往往难以满足需求。AntV X6作为专业的图编辑引擎,配合Vue框架,能够帮助我们构建出既美观又…...

YOLO26-seg分割优化:注意力魔改 | SimAM(无参Attention),一种轻量级的自注意力机制,效果秒杀CBAM、SE

💡💡💡SimAM是一种轻量级的自注意力机制,其网络结构与Transformer类似,但是在计算注意力权重时使用的是线性层而不是点积 💡💡💡本文改进:分别加入到YOLO26的backbone、neck、detect,助力涨点 改进1结构图: 改进2结构图: 改进3结构图:...

如何在Blender中导入MMD模型:MMD Tools插件完整教程

如何在Blender中导入MMD模型:MMD Tools插件完整教程 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools 如果…...

biliTickerBuy项目中的HTTP 429错误处理优化:3大策略提升抢票成功率

biliTickerBuy项目中的HTTP 429错误处理优化:3大策略提升抢票成功率 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 在B站会员购抢票工具biliTickerBuy中,HTTP 429错误处…...

如果临近上线,你的组员说有风险,你作为组长应该怎么处理

一、第一时间先稳住,别慌也别压不让组员不敢说话不让团队陷入情绪对立让组员同步完整信息:问题复现步骤、影响范围(全量 / 部分用户、核心流程 / 边缘功能)问题严重级别:崩溃 / 资损 / 流程阻断 / UI 小问题根因初步判…...

论文阅读:ICLR 2026 A Guardrail for Safety Preservation: When Safety-Sensitive Subspace Meets Harmful-Res

总目录 大模型安全研究论文整理 2026年版:https://blog.csdn.net/WhiffeYF/article/details/159047894 https://openreview.net/forum?id887vde4ZAW https://openreview.net/pdf?id887vde4ZAW A Guardrail for Safety Preservation: When Safety-Sensitive Sub…...

Microchip PIC64GX:64位RISC-V多核微处理器解析与应用

1. Microchip PIC64GX:首款64位RISC-V多核微处理器深度解析当Microchip宣布推出PIC64GX系列时,整个嵌入式行业都为之一振。作为Microchip首款64位RISC-V架构的微处理器,PIC64GX不仅填补了该公司在高性能RISC-V处理器领域的空白,更…...

终极指南:如何在Windows上轻松玩转经典Flash游戏与存档管理

终极指南:如何在Windows上轻松玩转经典Flash游戏与存档管理 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否怀念那些曾经风靡一时的Flash游戏?当现代浏览器纷…...

LeetCode 接雨水:python 题解

1. 智能软件工程的范式转移:从库集成到原生框架演进 在生成式人工智能(Generative AI)从单纯的文本生成向具备自主规划与执行能力的“代理化(Agentic)”系统跨越的过程中,.NET 生态系统正在经历一场自该平台…...

XUnity.AutoTranslator完整教程:3步实现Unity游戏实时翻译

XUnity.AutoTranslator完整教程:3步实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因为语言障碍而无法畅玩心仪的日系RPG或欧美独立游戏?XUnity.Au…...

从‘孔径不够’到‘合成来凑’:聊聊SAR模型背后的工程智慧与那些年我们踩过的坑

从‘孔径不够’到‘合成来凑’:SAR模型背后的工程智慧与实战陷阱 雷达技术的发展史就是一部人类突破物理限制的史诗。上世纪50年代,当工程师们面对"要获得3米分辨率需要数十公里天线孔径"这一不可能任务时,合成孔径雷达&#xff08…...