Python Errno 2没有这样的文件,前导零

2024-09-30 06:32:00 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的程序:

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个不同的文件夹),但是有些文件夹有前导零。例如,它可能看起来像这样:

许斌(音译)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/'

但是!当我进入目标目录时,文件夹已正确复制为:

许斌(音译)I01(音译)J01(音译)。你知道吗

所以它说这个文件夹不存在,但是不管怎样都正确地复制了它并且立即停止(没有其他文件夹被复制)。你知道吗

这是怎么回事?你知道吗

谢谢你的帮助!你知道吗


Tags: inimportsrc文件夹音译bindsths
3条回答

通过使用字符串格式来执行零填充和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次了。您正在迭代n232次,j8次,i29次。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)

它更容易阅读,并且可以让您插入一个非常重要的打印语句,它将向您显示正在发生的结果。你知道吗

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())

从本地上下文(大致上是您应该将此代码放入的函数)执行值(srcij)的字符串插值,并使用: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)

我仍然不认为你想复制50K+目录…但也许你想。如果是这样的话,这是一种更干净、更防弹的方法。你知道吗

相关问题 更多 >

    热门问题