之前我问过这个问题,但不清楚,我会尝试这个时间让它更清楚。我正在创建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)
答案 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...