读取TIFF图像描述按refDes分类时遇WinError123错误求助
问题描述
文件夹内有大量TIFF图像,需读取图像描述(Image description)中的refDes字段信息,将图像分类移动至以refDes命名的子文件夹。运行Python代码时触发以下错误:
File "", line 225, in makedirs
OSError: [WinError 123] 文件名、目录名或卷标语法不正确
当前使用代码:
import os import shutil import tifffile folder_path = "Input" output_folder = "Output" results = [] for filename in os.listdir(folder_path): if filename.endswith(".tif") or filename.endswith(".tiff"): file_path = os.path.join(folder_path, filename) with tifffile.TiffFile(file_path) as tif: description = tif.pages[0].description metadata = dict(tuple(line.split('=', 1)) for line in description.splitlines()) result_dict = { "filename": filename, "integrationLevel": metadata['integrationLevel'], "binningMode": metadata['binningMode'], "resolution": metadata['resolution'], "refDes": metadata['refDes'] } results.append(result_dict) for result in results: refDes_folder = os.path.join(output_folder, result["refDes"]) if not os.path.exists(refDes_folder): os.makedirs(refDes_folder) shutil.copy2(os.path.join(folder_path, result["filename"]), refDes_folder) print("Done")
错误原因
WinError 123是因为从TIFF描述中读取的refDes值包含Windows系统禁止的目录名字符,比如< > : " / \ | ? *这类符号,导致无法创建合法的子文件夹。
解决方案
添加目录名清理函数,移除或替换非法字符,同时优化代码逻辑避免冗余判断。修正后的代码如下:
import os import shutil import tifffile def sanitize_folder_name(name): # 定义Windows系统禁止的目录名字符,统一替换为下划线 invalid_chars = '<>:"/\\|?*' for char in invalid_chars: name = name.replace(char, '_') # 去除首尾空格、换行符,避免无效目录名 return name.strip() folder_path = "Input" output_folder = "Output" results = [] for filename in os.listdir(folder_path): # 忽略大小写匹配TIFF后缀 if filename.lower().endswith((".tif", ".tiff")): file_path = os.path.join(folder_path, filename) with tifffile.TiffFile(file_path) as tif: description = tif.pages[0].description metadata = dict(tuple(line.split('=', 1)) for line in description.splitlines()) result_dict = { "filename": filename, "integrationLevel": metadata['integrationLevel'], "binningMode": metadata['binningMode'], "resolution": metadata['resolution'], "refDes": sanitize_folder_name(metadata['refDes']) } results.append(result_dict) # 提前创建输出根目录,避免根目录不存在的问题 os.makedirs(output_folder, exist_ok=True) for result in results: refDes_folder = os.path.join(output_folder, result["refDes"]) # 使用exist_ok=True直接创建,无需提前判断目录是否存在 os.makedirs(refDes_folder, exist_ok=True) shutil.copy2(os.path.join(folder_path, result["filename"]), refDes_folder) print("Done")
关键修改点
- 新增
sanitize_folder_name函数,清理refDes中的非法字符,确保目录名合法 - 后缀判断改为小写匹配,兼容
.TIF、.TIFF等大小写变体 - 使用
os.makedirs(..., exist_ok=True)替代手动判断目录存在性,简化代码并避免竞态条件 - 提前创建输出根目录,消除根目录不存在的潜在错误
内容的提问来源于stack exchange,提问作者Neko Lim
相关产品推荐
相关产品推荐

