我不喜欢测试要移动的文件的名称来查看我们是否已经位于目标目录中。相反,此解决方案仅扫描目标的子目录
import os
import itertools
import shutil
def move(destination):
all_files = []
for root, _dirs, files in itertools.islice(os.walk(destination), 1, None):
for filename in files:
all_files.append(os.path.join(root, filename))
for filename in all_files:
shutil.move(filename, destination)
说明: os.walk 以“自上而下”的方式递归地走到目的地。整个文件名是通过 os.path.join(root, filename) 调用构造的。现在,为了防止扫描目标顶部的文件,我们只需要忽略 os.walk 迭代的第一个元素。为此,我使用 islice(iterator, 1, None)。另一种更明确的方法是这样做:
def move(destination):
all_files = []
first_loop_pass = True
for root, _dirs, files in os.walk(destination):
if first_loop_pass:
first_loop_pass = False
continue
for filename in files:
all_files.append(os.path.join(root, filename))
for filename in all_files:
shutil.move(filename, destination)