[英]Python Errno 2 - No such file, leading zeros
这是我的程序:
import numpy as np
import scipy as sp
import itertools
import os
import csv
import shutil
src = 'src';
dst = 'dst';
data = []
n = 1
while n < 233:
charn = str(n)
for j in range(1,9): # This will represent each plug subdirectory
for i in range(1,30):
if i < 10:
chari = str(i).zfill(2)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
chari = str(i)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
print chari
print charj
print charn
n = n + 1
因此,我要将文件夹从一个目录复制到另一个目录(232个不同的文件夹),但是有些文件夹的前导零。 例如,它可能看起来像这样:
HS_BIN_I01_J01
而其他人看起来像这样:
HS_BIN_I12_J08(J从不超过08,而我上升到29)。
因此,当我编写脚本时,自然需要适应这些前导零。 不幸的是,执行该错误时出现以下错误:
Traceback (most recent call last):
File "cpfldr_232points.py", line 34, in <module>
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
File "/usr/lib64/python2.6/shutil.py", line 136, in copytree
names = os.listdir(src)
OSError: [Errno 2] No such file or directory: '/src/HS_BIN_I1_J01/'
但! 当我进入目标目录时,该文件夹已被正确复制为:
HS_BIN_I01_J01。
因此,它说该文件夹不存在,但是无论如何都正确地将其复制并立即停止(不复制其他文件夹)。
这里发生了什么?
谢谢你的帮助!
您可以通过使用字符串格式设置Python标准库中itertools模块的零填充和product
方法来使代码的意图更清晰:
import itertools
import shutil
import os.path
src = 'src'
dst = 'dst'
for i, j in itertools.product(range(1, 9), range(1, 30)):
dirname = 'HS_BIN_I{0:02}_J{1:02}'.format(i, j)
destdir = '{prefix}{n}'.format(prefix=dst, n=i*j)
shutil.copytree(os.path.join(src, dirname),
os.path.join(destdir, dirname))
我认为您需要其他声明:
if i < 10:
chari = str(i).zfill(2)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
chari = str(i)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
现在,无论数量是否小于10,您的代码都将执行上述代码的两个位。 它应该是:
if i < 10:
chari = str(i).zfill(2)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
else:
chari = str(i)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
但是,您实际上根本不需要第二部分。 在您之后if i in range(1, 30):
请执行以下操作:
chari = str(i).zfill(2)
charj = str(j).zfill(2)
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
zfill会在必要时添加前导零。
您循环的次数超过233次。 您要重复n
232次, j
8次和i
29次。 232 * 8 * 29 =53824。所以发生的事情之一就是您生成的路径比您想象的要多得多。
其次,完全不清楚您实际生成的路径。 该代码太复杂了,无法轻易猜测。 代替:
shutil.copytree(src+'HS_BIN_I'+chari+'_J'+charj+'/',dst+charn+'/'+'HS_BIN_I'+chari+'_J'+charj+'/')
考虑:
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)
它更容易阅读,它可以让你插入一个非常重要的print语句会告诉你什么结果发生。
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)
这将表明您正在生成似乎缺少键"/"
分隔符的路径:
src_path: 'srcHS_BIN_I10_J08/' dst_path: 'dst232/HS_BIN_I10_J08/'
更好的是,使用更高级别的格式化操作生成path语句。 您正在进行许多手动转换,字符串的format
方法更干净。 例如,
src_path = "{src}/HS_BIN_I{i:02d}_J{j:02d}/'.format(**locals())
从本地上下文(大致来说,应将此代码放入的函数)中对值( src
, i
和j
)进行字符串插值,并使用格式说明符,如:02d
(“带前导零的两位整数,如果需要的话”)。
最终代码:
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)
我仍然不认为您要复制5万多个目录...但是也许您愿意。 如果是这样,这是一种更清洁,更防弹的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.