Python:使用shutil.move或os.rename移动文件夹

5 投票
2 回答
9677 浏览
提问于 2025-04-18 03:55

我写了一个脚本,用来把视频文件从一个文件夹移动到另一个文件夹,它还会通过os.walk来搜索子文件夹。不过,如果脚本找到一个视频文件,它只会移动这个文件,而不会移动包含它的文件夹。我加了一个if语句来检查包含文件的文件夹是否和最开始搜索的文件夹不同。

我找不到实际移动(或者重命名?)文件夹和文件到不同目录的代码。我看了很多关于移动文件的资料,但就是找不到关于移动文件夹的内容。

我尝试使用shutil.move和os.rename,但每次都会出错。当我试着查找问题时,得到的结果大多是关于如何移动文件,或者如何改变Python的当前工作目录。

任何建议(甚至是如何准确描述这个主题来搜索教程)都会非常感谢。这是我第一个真正的Python程序,我学到了很多,但最后这一步让我很头疼!

编辑:当我尝试使用os.rename(src_file, dst_file)时,出现了错误WindowsError: error 3 The system cannot find the path specified.

当我尝试shutil.move(src_file, dst_file)时,出现了ioerror errno 2 no such file or directory "H:\\Moviesfrom download...\OneOfTheVideoFilesNotInParentFolder 也就是说,文件夹和文件都需要移动。

谢谢。

附言:正如我所说,这是我在代码学院之外写的第一个脚本,所以任何随机的建议我都很感激。

import os
import shutil
import time

movietypes = ('.3gp', '.wmv', '.asf', '.avi', '.flv', '.mov', '.mp4', '.ogm', '.mkv',
'. mpg', '.mpg', '.nsc', '.nsv', '.nut', '.a52', '.tta', '.wav', '.ram', '.asf',
'.wmv', '. ogg', '.mka', '.vid', '.lac', '.aac', '.dts', '.tac',
'.dts', '.mbv')

filewrite = open('H:\\Movies from download folder\\Logs\\logstest.txt', 'w')
dir_src = "C:\\Users\\Jeremy\\Downloads\\"
dir_dst = "H:\\Movies from download folder\\"

for root, dirs, files in os.walk(dir_src):
    for file in files:
        if file.endswith(movietypes) == True:
           filestr = str(file)
           locationoffoundfile = os.path.realpath(os.path.join(root,filestr))
           folderitwasin = locationoffoundfile.replace(dir_src,'')
           folderitwasin = folderitwasin.replace(filestr,'')
           pathofdir = os.path.realpath(root) + "\\"
           if pathofdir != dir_src:
                src_file = locationoffoundfile
                dst_file = dir_dst + folderitwasin + filestr
                os.rename(src_file, dst_file) #****This line is the line im having issues with***
                print src_file
                print dst_file
                filewrite.write(file + " " + "needs to have dir and file moved Moved!" + '\n')
           else:
                src_file = os.path.join(dir_src, file)
                dst_file = os.path.join(dir_dst, file)
                print src_file
                print dst_file
                shutil.move(src_file, dst_file)
                filewrite.write(os.path.dirname(file) + '\n')
                filewrite.write(file + " " + "needs to have file moved Moved!" + '\n')
filewrite.close()

2 个回答

0

因为这些是微软Windows系统的路径,所以要使用正斜杠(/)来代替反斜杠(\)。同时,把路径声明为一个字符串字面量;比如:

dir_dst = r"H:/Movies from download folder/"
3

看起来你只是移动文件,而没有处理文件夹。所以如果你试着把

C:\Users\Jeremy\Downloads\anime\pokemon.avi

移动到

H:\Movies from download folder\anime\pokemon.avi

的话,会失败,因为在 H:\ 上还没有 anime 这个文件夹。

在处理 files 之前,先处理 dirs,确保目标位置的文件夹存在,如果没有的话就创建一个。

for root, dirs, files in os.walk(dir_src):
    for dir in dirs:
        dest_dir = os.path.join(dir_dst, dir)
        if not os.path.isdir(dest_dir):
            os.mkdir(dest_dir)
    for file in files:
    #rest of code goes here as usual...

撰写回答