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