如何在Python中移动目录?

如何在Python中移动目录?,python,Python,我需要将目录从同一文件系统上的一个位置移动到另一个位置。我知道类似于shutil.move()的解决方案,但是所讨论的文件系统是一个SD卡(因此速度非常慢),并且有很多文件需要移动,因此简单地复制它们然后删除原始文件是不可接受的。Unixmv命令可以在不复制任何文件的情况下将目录从一个文件系统移动到同一个文件系统——在Python中有这样做的方法吗?答案是肯定的。您可能知道,可以使用os.rename(r'D:\path1\myfile.txt',r'D:\path2\myfile.txt')移

我需要将目录从同一文件系统上的一个位置移动到另一个位置。我知道类似于
shutil.move()
的解决方案,但是所讨论的文件系统是一个SD卡(因此速度非常慢),并且有很多文件需要移动,因此简单地复制它们然后删除原始文件是不可接受的。Unix
mv
命令可以在不复制任何文件的情况下将目录从一个文件系统移动到同一个文件系统——在Python中有这样做的方法吗?

答案是肯定的。您可能知道,可以使用
os.rename(r'D:\path1\myfile.txt',r'D:\path2\myfile.txt')
移动文件(假设目标中不存在该文件)。您可以对目录执行相同的操作:

os.rename(r'D:\long\path\to\mydir',r'D:\mydir')
但是,当然,只有当D:\mydir不存在时,这才有效。如果它确实存在,并且您希望将已经存在的文件与正在移动的文件合并,那么您需要更聪明一点。下面是一个片段,它可以满足您的需要:

def movedir(src,dst):
尝试:
重命名(src,dst)
返回
除文件ExistError外:
通过
对于os.walk(src)中的根目录、目录和文件:
dest_root=os.path.join(dst,os.path.relpath(root,src))
完成=[]
对于目录中的目录:
尝试:
重命名(os.path.join(root,dir),os.path.join(dest\u root,dir)
完成。追加(目录)
除文件ExistError外:
通过
对于已完成的目录:
目录删除(目录)
对于文件中的文件:
替换(os.path.join(根,文件),os.path.join(dest_根,文件))
对于os.walk(src,top-down=False)中的root、dirs和文件:
os.rmdir(根目录)
下面是一个版本,其中包含解释一切功能的注释:

def movedir(src,dst):
#如果目标中不存在同名的目录,我们可以简单地重命名该目录
#到另一个路径,它将被移动--它将从源路径消失并出现在目标路径中
#路径,而不复制任何文件。
尝试:
重命名(src,dst)
返回
除文件ExistError外:
#如果已经存在同名目录,则必须合并它们。下面的算法就是这样做的。
通过
对于os.walk(src)中的根目录、目录和文件:
dest_root=os.path.join(dst,os.path.relpath(root,src))
完成=[]
对于目录中的目录:
尝试:
重命名(os.path.join(root,dir),os.path.join(dest\u root,dir)
完成。追加(目录)
除文件ExistError外:
通过
#告诉os.walk()不要递归到我们已经移动的子目录中。请参阅os.walk()上的文档
#关于这项工作的原因:https://docs.python.org/3/library/os.html#os.walk
#列表不能在迭代过程中修改,因此我们必须将所有要从列表中删除的项都放在列表中
#进入第二个列表,然后在循环后删除它们。
对于已完成的目录:
目录删除(目录)
#移动文件。os.replace()有点像os.rename(),但是如果目标中存在一个具有
#如果名称相同,它将被删除并替换为源文件,而不提示用户。没有
#处理目录,所以我们只对文件使用它。
#如果需要,您可能希望将其更改为os.rename(),并用try/except文件existerror将其包围
#要提示用户覆盖文件。
对于文件中的文件:
替换(os.path.join(根,文件),os.path.join(dest_根,文件))
#打扫干净。
#我们能够成功地移动目录,只需重命名它们(目录中不存在的目录)
#目标(已存在)已从源中消失。我们必须合并的目录仍然存在
#源,但其内容已被移动。除非目录已为空,否则os.rmdir()将失败。
对于os.walk(src,top-down=False)中的root、dirs和文件:
os.rmdir(根目录)
movedir(r'D:\long\path\to\mydir',r'D:\mydir')
请注意,仅当源路径和目标路径位于同一文件系统上时(在Windows上,如果它们具有相同的驱动器号,则为真),才能以这种方式使用os.rename()。如果它们位于不同的驱动器号上(即一个位于C:上,另一个位于D:),或者如果其中一个路径包含重分析点(如果您不知道重分析点是什么,请不要担心,您可能永远不会遇到重分析点),则需要使用
shutil.move()
,它会复制文件,然后从源文件中删除这些文件--这就是Windows在驱动器之间移动文件时所做的操作,完成此操作所需的时间约为