Python将文件和目录从一个文件夹移动到另一个文件夹

Ric*_*ard 3 python

我想将一个目录中的python文件和目录移动到具有覆盖能力的另一个目录.

我从以下代码开始:

        #moving files from progs
        path = tempfolder + 'progs/'
        for dirs,files in os.listdir(path):
                 for f in files:
                        shutil.move(os.path.join(path, f) , os.path.join(compteurfolder, f))
Run Code Online (Sandbox Code Playgroud)

所以目前,我只是尝试移动文件,我得到以下错误:

    for dirs,files in os.listdir(path):
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

我想这是因为我有dirs和文件但是我怎样才能移动目录呢?以及如何确保它可以覆盖其他文件夹中的文件?

希望你能帮忙.

aba*_*ert 6

失败的原因:

for dirs,files in os.listdir(path):
Run Code Online (Sandbox Code Playgroud)

... os.listdir只是返回文件名列表.因此,每个元素都是一个字符串,并且您尝试将该字符串解压缩为两个变量.比较一下:

a, b = (1, 2, 3, 4, 5, 6, 7, 8)
for a, b in [(1, 2, 3, 4, 5, 6, 7, 8), (9, 10)]
dirs, files = "spam.txt"
for dirs, files in ["spam.txt", "eggs.dat"]
Run Code Online (Sandbox Code Playgroud)

在每种情况下都是完全相同的错误 - 你不能将8个东西放入2个变量中.

同时,如果listdir只是返回文件名,你怎么知道常规文件的名称,哪些是目录的名称?你必须要求 - 例如,通过使用isdir.

所以:

for filename in os.listdir(path):
    if os.path.isdir(filename):
        # do directory stuff
    else:
        # do regular file stuff
Run Code Online (Sandbox Code Playgroud)

(但请注意,如果你有符号链接,这仍然会让人感到困惑......)


同时,"常规文件的东西"是什么意思?

好吧,假设您没有与您尝试移动的文件同名的目录(或目录的符号链接),作为shutil.move说明os.rename或shutil.copy2将要使用的文档.如果您不在Windows上,这是完美的 - 如果您有权覆盖目标,否则您将收到权限错误.但是,如果你是在Windows上,os.rename会如果目标已经存在失败.

如果您使用的是3.3或更高版本,则可以通过复制shutil.move源*来解决此问题,os.replace而不是像rename文档所暗示的那样使用.否则,您必须在重命名源之前删除目标.

*一些stdlib模块 - 包括shutil- 意味着作为示例代码以及可用的帮助程序.在这些情况下,在模块的文档的顶部,将有一个源代码:链接.


那么"做目录的东西"呢?好吧,如果你将一个目录移动spam到一个目标eggs/spam,并且eggs/spam已经作为目录存在,那么你最终会转移到eggs/spam/spam.

这应该不足为奇,因为它mv在Unix和moveWindows 上完全相同,这shutil就是试图模拟的东西.

所以,你需要做的是shutil.rmtree在移动源之前删除目标(这次使用).


这意味着最简单的事情可能是不区分文件和目录,Windows和Unix,或其他任何东西; 这样做:

for filename in os.listdir(path):
    target = os.path.join(compteurfolder, filename)
    try:
        shutil.rmtree(target)
    except NotADirectoryError:
        try:
            os.unlink(target)
        except FileNotFoundError:
            pass
    shutil.move(os.path.join(path, filename), target)
Run Code Online (Sandbox Code Playgroud)