移动文件夹内容而不移动源文件夹

问题描述 投票:0回答:3

shutil.move(src, dst) 是我认为可以完成这项工作的方法,但是,根据 Python 2 文档

shutil.move(src, dst) 递归地将文件或目录(src)移动到 另一个地点(夏令时)。

如果目标是现有目录,则 src 会移至其中 那个目录。如果目的地已存在但不是 目录,它可能会被覆盖,具体取决于 os.rename() 语义。

这与我的情况有点不同,如下:

搬家前: https://snag.gy/JfbE6D.jpg

shutil.move(staging_folder, final_folder)

搬家后: https://snag.gy/GTfjNb.jpg

这不是我想要的,我希望将暂存文件夹中的所有内容移至文件夹“final”下,我不需要“staging”文件夹本身。

python shutil
3个回答
5
投票

您可以使用

shutil.copytree()
staging_folder 中的所有内容移动到 final_folder ,而不移动 staging_folder 。调用函数时传递参数
copy_function=shutil.move

对于 Python 3.8:

shutil.copytree('staging_folder', 'final_folder', copy_function=shutil.move, dirs_exist_ok=True)

对于 Python 3.7 及以下版本:

请注意,不支持参数

dirs_exist_ok
。目的地 final_folder 不得已存在,因为它将在移动过程中创建。

shutil.copytree('staging_folder', 'final_folder', copy_function=shutil.move)

示例代码(Python 3.8):

>>> os.listdir('staging_folder')
['file1', 'file2', 'file3']

>>> os.listdir('final_folder')
[]

>>> shutil.copytree('staging_folder', 'final_folder', copy_function=shutil.move, dirs_exist_ok=True)
'final_folder'

>>> os.listdir('staging_folder')
[]

>>> os.listdir('final_folder')
['file1', 'file2', 'file3']


2
投票

事实证明路径不正确,因为它包含被误解的内容。

我最终使用了 Shutil.move + Shutil.copy22

for i in os.listdir(staging_folder):
    if not os.path.exists(final_folder):
        shutil.move(os.path.join(staging_folder, i), final_folder)
    else:
        shutil.copy2(os.path.join(staging_folder, i), final_folder)

然后清空旧文件夹:

def emptify_staging(self, folder):
    for the_file in os.listdir(folder):
        file_path = os.path.join(folder, the_file)
        try:
            if os.path.isfile(file_path):
                os.unlink(file_path)
                # elif os.path.isdir(file_path): shutil.rmtree(file_path)
        except Exception as e:
            print(e)

0
投票

您可以使用

os.listdir
,然后将每个文件移动到所需的目的地。

例如:

import shutil
import os

for i in os.listdir(staging_folder):
    shutil.move(os.path.join(staging_folder, i), final_folder)
© www.soinside.com 2019 - 2024. All rights reserved.