路径未知时使用shutil.move移动文件出现FileNotFoundError的问题
解决跨子目录移动.raw文件的问题
你的判断完全正确——错误根源是文件路径构造错误。os.walk遍历子目录时,变量r代表当前正在遍历的子目录路径,而非初始的根目录path。你之前直接拼接path + '/' + file,相当于默认所有文件都在根目录下,自然找不到子目录里的文件。
修正后的代码
import os import shutil path = 'C:/Users/R/Documents/16-2/gsi_14-01-2019' dest_path = 'C:/Users/R/Documents/Hyperspectral/Datafiles/Raw' # 确保目标目录存在,不存在则自动创建 os.makedirs(dest_path, exist_ok=True) # r=当前遍历的子目录路径, d=当前目录下的子目录列表, f=当前目录下的文件列表 for r, d, f in os.walk(path): for file in f: # 精准匹配.raw扩展名,避免误判类似xxx.raw.txt的文件 if file.endswith('.raw'): # 构造文件的真实完整路径(结合当前子目录) src_full_path = os.path.join(r, file) dest_full_path = os.path.join(dest_path, file) # 处理重名文件:自动添加计数器避免覆盖 counter = 1 while os.path.exists(dest_full_path): filename, ext = os.path.splitext(file) dest_full_path = os.path.join(dest_path, f"{filename}_{counter}{ext}") counter += 1 shutil.move(src_full_path, dest_full_path)
关键修改说明
- 正确构造文件路径:用
os.path.join(r, file)替代手动拼接路径,既适配不同系统的路径分隔符,又能准确获取子目录中文件的完整路径。 - 精准匹配扩展名:
file.endswith('.raw')比'.raw' in file更严谨,不会误匹配文件名中包含.raw但扩展名不符的文件。 - 确保目标目录存在:
os.makedirs(dest_path, exist_ok=True)提前创建目标目录,避免移动时因目录不存在报错。 - 处理重名冲突:增加计数器逻辑,若目标目录已有同名文件,自动重命名为
文件名_1.raw、文件名_2.raw,防止文件被意外覆盖。
内容的提问来源于stack exchange,提问作者russj
相关产品推荐
相关产品推荐

