创建目录时的循环控制

时间:2014-11-10 20:22:09

标签: python for-loop mkdir continue shutil

之前我问过这个问题,但不清楚,我会尝试这个时间让它更清楚。我正在创建66个目录,每个目录有19个子目录,其中19个(全部将命名为1-19)子目录我移动三个文件,两个文件是任意的第三个文件有数据依赖于它的循环它是,第4个循环将创建一个目录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 /,但停在那里并说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)

2 个答案:

答案 0 :(得分:1)

虽然您的代码似乎存在多个问题(例如,您永远不会close该文件,甚至flush它,但您尝试复制它,这意味着您可以轻松地获取不完整的文件,空文件,甚至锁定错误),我认为您要问的问题可以用一个词来回答:makedirs

  

因为我在for循环中的所有内容都在1到20之间,所以它一直在尝试创建另一个主目录,并且它说我已经创建了

如果您致电os.makedirs('foo/bar/baz', exist_ok=True),当且仅当它不存在时才会创建foo,当且仅当它不存在时才创建foo/bar,然后创建foo/bar/baz {1}}当且仅当它不存在时。无论是3还是存在,只有前2个,或者没有,你都不会有错误。

在Python 3.1和早期版本(包括2.7)中,没有exist_ok参数。但是如果存在所有3个目录,则只会出错;事实上,例如,foo/bar已经存在仍然没有问题。

答案 1 :(得分:1)

您有几个问题,包括没有正确创建目标路径并尝试写入目录名而不是文件。尝试使用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...