【问题标题】:Python: Using shutil.move or os.rename to move foldersPython:使用 shutil.move 或 os.rename 移动文件夹
【发布时间】:2014-06-08 06:50:51
【问题描述】:

我编写了一个脚本来将视频文件从一个目录移动到另一个目录,它还会使用 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,即文件夹和文件需要移动。

谢谢。

ps 就像我说的那样,这是我在代码学院之外的第一个脚本,所以任何随机建议也将不胜感激。

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()

【问题讨论】:

  • “我尝试过使用 shutil.move 和 os.rename,但两次都出现错误。” 错误说明了什么?
  • 我已经用错误的详细信息更新了我的原始帖子。

标签: python rename shutil


【解决方案1】:

看起来您只是在移动文件,而不对文件夹做任何事情。所以如果你尝试移动

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...

【讨论】:

  • 谢谢!它的工作!我用过:如果不是 os.path.isdir(dir_dst + folderitwasin): os.mkdir(dir_dst + folderitwasin) shutil.move(src_file, dst_file) 我仍然需要删除旧目录,我现在正在处理!跨度>
【解决方案2】:

由于这些是 MS Windows 路径,因此使用正斜杠并将路径声明为 string literal;例如

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

【讨论】:

  • 谢谢。我已经改变了,但现在我遇到了 os.path.realpath(os.path.join(root,filestr)) 命令的问题。它返回 C:\\users\\jeremy\\downloads\\... 我会看看是否应该使用不同的命令。
  • 我认为斜线方向没有区别。无论哪种方式,它总是对我有用。
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2015-05-02
  • 2021-09-11
相关资源
最近更新 更多