Python基于部分文件名批量复制文件遇空结果问题求助
问题原因
你代码里的匹配逻辑完全错了——Class_01_*.txt是通配符模式,不是子字符串,用if list in file判断的话,只会找文件名里有没有Class_01_*.txt这个完整字符串,而实际文件名里根本没有*,所以这个条件其实从来没触发过,你看到的打印大概率是之前测试的残留。
修复代码
用Python自带的fnmatch模块处理通配符匹配,这才是正确的姿势,修改后的代码如下:
import os, shutil, fnmatch path = 'G:/source/path/dir' new_path = 'D:/test' files = os.listdir(path) # 修正range写法:Python里数字前加0会被当成八进制,直接写十进制更稳妥 lt = [*range(1, 3), *range(2178, 2186), *range(5020, 5024)] patterns = [f"Class_{i}_*.txt" for i in lt] # 先确保目标目录存在,不然复制会报错 if not os.path.exists(new_path): os.makedirs(new_path) for file in files: for pattern in patterns: # 用fnmatch判断文件名是否符合通配符模式 if fnmatch.fnmatch(file, pattern): print(file) src_file = os.path.join(path, file) shutil.copy(src_file, new_path)
关键改动说明
- 通配符匹配:
fnmatch.fnmatch(file, pattern)能正确识别*通配符,匹配任意长度的字符,完全符合你的需求。 - 数字范围修正:
range(01,03)会被解析为八进制,容易出问题,换成range(1,3)才是正确的十进制范围。 - 目标目录检查:添加目录创建逻辑,避免因为目标目录不存在导致复制失败。
- 变量名优化:把
list改成pattern,避免和Python内置的list类型重名,减少潜在bug。
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

