Python 创建目录时的循环控制

Python 创建目录时的循环控制,python,for-loop,mkdir,continue,shutil,Python,For Loop,Mkdir,Continue,Shutil,我以前问过这个问题,但不清楚,这次我会尽量弄清楚。我正在创建66个目录,每个目录有19个子目录,在这19个子目录中(全部将命名为1-19)我正在移动三个文件,两个文件是任意的。第三个文件的数据依赖于它所在的循环,第四个循环将创建一个目录4/并包含一个内部有4个文件的特定文件,等等。。我试图使用break,continue语句来控制循环,以便只创建一个目录,但创建19个子目录时使用该文件中的正确数据,该文件的名称在每个目录中必须相同,因此我必须在循环过程中立即移动它们,以使其中的数据不会被覆盖,由

我以前问过这个问题,但不清楚,这次我会尽量弄清楚。我正在创建66个目录,每个目录有19个子目录,在这19个子目录中(全部将命名为1-19)我正在移动三个文件,两个文件是任意的。第三个文件的数据依赖于它所在的循环,第四个循环将创建一个目录4/并包含一个内部有4个文件的特定文件,等等。。我试图使用break,continue语句来控制循环,以便只创建一个目录,但创建19个子目录时使用该文件中的正确数据,该文件的名称在每个目录中必须相同,因此我必须在循环过程中立即移动它们,以使其中的数据不会被覆盖,由于我在for循环中拥有从1到20的所有内容,因此它不断尝试创建另一个主目录,并表示我已经创建了,下面是我的代码:

base_direct = '{}/'.format(dir_Name) #create the main directories so they are already there,

for x in range(1,20): #loop to create 19 subdirectories 
        if not os.path.exists(str(x)+'/'):os.mkdir(str(x)+'/') #create directories 1/ 2/ 3/ etc..
        else: continue
        shutil.copy(filename, str(x)) #copy file to the directories
        shutil.copy(filename1, str(x)) #copy second file
        frag = open("fragments_procs.in", 'w') #open a new file
        frag.write(str(x) + "\n" + str(20-x)) #file will read 1, 19, since it is on first loop and must be in 1/, second file will read 2 18 must be in 2/ etc...
        shutil.copy("fragments_procs.in", str(x)) #copy the input file into the numbered directory
        shutil.move(str(x), '{}/'.format(dir_Name)) #move 1/ -> /dir_Name
        if not os.path.exists('{}/'.format(dir_Name)+str(x)):shutil.move(str(x), '{}/'.format(dir_Name)) #if dir_name/1/ exists continue to making dir_Name/2/
        else: continue


genFiles(dir_Name, filename, filenam1)
genfiles("Water-Water", "Water1", "Water0")
代码正在运行并创建Water/,但在那里停止并表示Water/1/已经存在

循环代码:

fileName = os.path.splitext(xyzfile)[0]
 for x in range(1,20):
     path = os.path.join(fileName, str(x))
     try:
         os.makedirs(path)
     except OSError as exception:
         if exception.errno != errno.EEXIST:
             raise

     shutil.copy(filename, os.path.join(path, filename))
     shutil.copy(filename1, os.path.join(path, filename1))
     with open(os.path.join(path, "fragments_procs.in"), 'w') as frag:
         frag.write(str(x) + "\n" +str(20-x))
             frag.flush()
             frag.close()

         subprocess.Popen(["sbatch", "/work/jobfile_fde", fileName,     "2"], cwd=path)

虽然您的代码似乎存在多个可能的问题(例如,您从未关闭文件,甚至从未刷新文件,但您试图复制它,这意味着您很容易得到不完整的文件、空文件,甚至锁定错误),但我认为您所问的问题可以用一个词来回答:

因为我在for循环中有从1到20的所有内容,所以它一直在尝试创建另一个主目录,这意味着我已经创建了一个主目录

如果调用
os.makedirs('foo/bar/baz',exist_ok=True)
,当且仅当它不存在时,将创建
foo
,当且仅当它不存在时创建
foo/bar
,当且仅当它不存在时创建
foo/bar/baz
。无论这3个都存在,只是前2个,或者都不存在,您都不会得到任何错误


在Python3.1和早期版本(包括2.7)中,没有
exist\u ok
参数。但只有当所有3个目录都存在时,您才会得到一个错误;例如,
foo/bar
已经存在这一事实仍然可以接受。

您有几个问题,包括没有正确创建目标路径以及试图写入目录名而不是文件。尝试使用
os.path
而不是编写自己的字符串,这样可以减少程序的混乱

for x in range(1,20): #loop to create 19 subdirectories
    path = os.path.join(dir_Name, str(x)) 
    os.makedirs(path, exist_ok=True) #create directories 1/ 2/ 3/ etc..
    shutil.copy(filename, os.path.join(path, filename))
    shutil.copy(filename1, os.path.join(path, filename1))
    with open(os.path.join(path, "fragments_procs.in"), 'w') as frag:
        frag.write(str(x) + "\n" + str(20-x)) #file will read 1, 19, since it is on first loop and must be in 1/, second file will read 2 18 must be in 2/ etc...

请不要试图在每一行上塞满尽可能多的内容。使用9字符缩进而不是标准的4字符缩进会使情况更糟,因为它会将更多的代码从屏幕的右边缘推出,迫使我们使用水平滚动条。因此,我们需要一个实际调试代码的示例,而不是一个过于详细但不完整且无法运行的示例,而不仅仅是猜测。修复了这些问题,很抱歉过于复杂,我在文件之后添加了close。(),但是当只创建了一个实例时,我假设在第二次迭代时,关闭它将完全关闭文件loop@octain:但是循环的第二次迭代太晚,无法关闭文件。您已经复制了文件中的任何内容,这些内容可能不是您的全部输出,因为您没有在复制之前进行任何操作(如
关闭
)。(另外,如果您想使用其他Python实现,如Jython或IronPython,它们不能保证在最后一个引用消失后立即清理垃圾,因此您可能会同时看到任意数量的文件仍然处于打开状态。)@octain:更一般地说:总是关闭文件更容易(最好使用
with
语句)要知道,我使用makedirs,刷新并关闭所有文件,效果非常好,谢谢你的澄清最后一部分应该是将1/2/3/移动到dir_名称中,但是我看到你用os.path做了什么,更干净了更简单的方法是在目录中打开新文件,而不是让它存在everywhere@octain-明白了!是的,只是写到最终位置通常是你想要的。如果其他软件正在扫描目录查找信息,这可能会有问题。但对于其他99.9%的时间,这很好。我使用的是python 2.7.6,当运行它给我一个“exist_ok”的TypeError时,我假设python在我的pc上不是最新的?@Octain-是的,如果不是os.path.exists(path):os.makedirs(path),请尝试
相反。我正在考虑更新,但我运行这些计算的HPC没有使用比我更高的版本,为了让系统管理员完成工作,我做了
尝试:os.makedirs(path)除了OSError
方法,工作得很好!