You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:03:10