<p>我找到了一个解决方案,结果证明,shutil的愚蠢限制,即只能将文件复制到不存在的文件夹中,这一限制毕竟是有用的,但我还需要使用distutils的copy_tree函数,幸运的是它们都是stdlib。首先,创建一个包含所有要复制的文件和文件夹的列表,如下所示:</p>
<pre class="lang-py prettyprint-override"><code>filesToCopy = ["File 2", "Folder 1", "Folder 3"]
</code></pre>
<p>然后我们需要为每个阶段创建两个循环</p>
<pre class="lang-py prettyprint-override"><code>import shutil, os
from distutils.dir_util import copy_tree
def swapFiles(newDir, prevDir):
bigFolder = "Big Folder/Path"
#Copy from the big folder to the prevDir
for file in filesToCopy:
#Check if what you're about to copy is a directory
if os.path.isdir(os.path.join(bigFolder, file)):
copy_tree(os.path.join(bigFolder, file), os.path.join(prevDir, file))
else:
#If its a file, do a simple copy
shutil.copy(os.path.join(bigFolder, file), os.path.join(prevDir, file))
#Remove the copies folders from the big folder
for file in filesToCopy:
if os.path.isdir(os.path.join(bigFolder, file)):
shutil.rmtree(os.path.join(bigFolder, file))
else:
os.remove(os.path.join(bigFolder, file))
#Copy over files from newDir to bigFolder
for file in filesToCopy:
if os.path.isdir(os.path.join(newDir, file)):
#I use shutil's copytree here because I want it to create the folders I deleted in the previous step
shutil.copytree(os.path.join(newDir, file), os.path.join(bigFolder, file))
else:
shutil.copy(os.path.join(newDir, file), os.path.join(bigFolder, file))
</code></pre>
<p>这样,文件结构就得到了维护,并且很容易指定要交换的文件和文件夹</p>