<p>你的循环次数已经超过233次了。您正在迭代<code>n</code>232次,<code>j</code>8次,<code>i</code>29次。232 * 8 * 29 = 53824. 所以其中一件事就是你产生的路径比你想象的要多得多。你知道吗</p>
<p>第二,完全不清楚你到底在生成什么路径。代码太复杂了,很难猜出来。而不是:</p>
<pre><code>shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
</code></pre>
<p>考虑:</p>
<pre><code>src_path = src+'HS_BIN_I'+chari+'_J'+charj+'/'
dst_path = dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/'
shutil.copytree(src_path, dst_path)
</code></pre>
<p>它更容易阅读,并且可以让您插入一个非常重要的打印语句,它将<em>向您显示正在发生的结果。你知道吗</p>
<pre><code>src_path = src+'HS_BIN_I'+chari+'_J'+charj+'/'
dst_path = dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/'
print "src_path:", src_path, "dst_path:", dst_path
shutil.copytree(src_path, dst_path)
</code></pre>
<p>这将证明您正在生成的路径似乎缺少键<code>"/"</code>分隔符:</p>
<pre><code>src_path: 'srcHS_BIN_I10_J08/' dst_path: 'dst232/HS_BIN_I10_J08/'
</code></pre>
<p>更好的是,使用更高级的格式化操作生成path语句。您正在进行大量的手动转换,而字符串的<code>format</code>方法做得更干净。例如</p>
<pre><code>src_path = "{src}/HS_BIN_I{i:02d}_J{j:02d}/'.format(**locals())
</code></pre>
<p>从本地上下文(大致上是您应该将此代码放入的函数)执行值(<code>src</code>、<code>i</code>和<code>j</code>)的字符串插值,并使用<code>:02d</code>(“如果需要,带前导零的两位数整数”)等格式说明符进行插值。你知道吗</p>
<p>最终代码:</p>
<pre><code>def copy_dirs(src, dst):
"""
Copy subfolders from `src` directory into `dst` directory,
if they are present.
"""
for n in range(1, 233):
for j in range(1, 9):
for i in range(1, 30):
src_path = "{src}/HS_BIN_I{i:02d}_J{j:02d}/".format(**locals())
dst_path = "{dst}/{n}/HS_BIN_I{i:02d}_J{j:02d}/".format(**locals())
# print "src_path:", src_path, "dst_path:", dst_path
if os.path.isdir(src_path):
shutil.copytree(src_path, dst_path)
</code></pre>
<p>我仍然不认为你想复制50K+目录…但也许你想。如果是这样的话,这是一种更干净、更防弹的方法。你知道吗</p>