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

Python如何检查列表中的数字字符串是否存在于文件名中并复制匹配文件

问题原因

  • 你的列表中每个item实际是单元素列表对象(从你给出的列表输出示例['00349']可以看出),直接调用str(item)得到的结果是"['00349']",而非纯5位数字字符串,自然无法匹配文件名中的数字。
  • 未加通配符的fnmatch.fnmatch是全文件名匹配,你注释掉的加前后通配符*的写法逻辑是对的,但因为strg2内容异常才返回失败。
  • 代码缺少os、shutil依赖库的导入,同时用内置关键字list作为变量名,会覆盖原生list方法导致潜在问题。

修正后的代码

import os
import shutil
import fnmatch

# 不要用list作为变量名,改为自定义名称避免覆盖内置方法
num_list = []

# 填充列表的相关代码保持不变

SOURCE_PATH = "dir/source"
TARGET_PATH = "dir/target"

# 提前创建目标目录避免不存在时报错
os.makedirs(TARGET_PATH, exist_ok=True)

for item in num_list:
    # 取列表的第一个元素,即纯5位数字字符串
    target_num = item[0]
    for fname in os.listdir(SOURCE_PATH):
        # 加通配符匹配文件名任意位置包含目标数字的情况
        if fnmatch.fnmatch(fname, f'*{target_num}*'):
            sourcepath = os.path.join(SOURCE_PATH, fname)
            shutil.copy(sourcepath, TARGET_PATH)
            break

额外优化建议

如果源目录下文件量很大,两层循环效率偏低,可以提前遍历一次源目录构建数字到文件名的映射,后续直接查表即可,不需要每次遍历所有文件:

import os
import shutil

num_list = []
SOURCE_PATH = "dir/source"
TARGET_PATH = "dir/target"
os.makedirs(TARGET_PATH, exist_ok=True)

# 提前构建数字到文件名的映射
num_to_fname = {}
for fname in os.listdir(SOURCE_PATH):
    # 适配name_xxxxx.json的文件名结构,提取中间5位数字
    num_part = fname.split('_')[1].split('.')[0]
    num_to_fname[num_part] = fname

for item in num_list:
    target_num = item[0]
    if target_num in num_to_fname:
        sourcepath = os.path.join(SOURCE_PATH, num_to_fname[target_num])
        shutil.copy(sourcepath, TARGET_PATH)

内容的提问来源于stack exchange,提问作者Hugh Rivers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:15:00