0

n 個のサブディレクトリを持つ n 個のフォルダーを作成するネストされた while ループを作成しようとしています。現在のコードの問題は、作成された最初のフォルダーにサブディレクトリが含まれていないことです。作成された 2 番目のディレクトリのみにサブディレクトリが含まれます。私の目標は、地下水モデリング ソフトウェアでパラメトリック スイープを実行するプログラムを作成することです。結果を保存するには、これらのディレクトリが必要です。

import subprocess, os

i = 1
j = 1
while i <= 2:
    path = r'C:/Users/TEvans/Desktop/Testing/slope%d' % i 
    if not os.path.exists(path): os.makedirs(path)
    os.chdir(path)
    i = i+1
    while j <= 3:
        path1 = r'C:/Users/TEvans/Desktop/Testing/slope%d/r%d' % (i, j)
        if not os.path.exists(path1): os.makedirs(path1)
        j = j+1     
4

4 に答える 4

2

コードの一部は冗長であり、(他の人が述べたように)while数学を混乱させています。

これは、より単純でほぼ同等のバージョンです。

import os
for i in (1,2):
  for j in (1,2,3):
    path1 = r'C:/Users/TEvans/Desktop/Testing/slope%d/r%d' % (i, j)
    if not os.path.exists(path1): os.makedirs(path1)
  • os.makedirs()これらのディレクトリは内側のループの によって作成されるため、外側のループのへの呼び出しを削除しましたos.makedirs()

  • 私は両方の計算を修正し、あなたが意図したij私が信じていることを反映させました。

  • os.chdir()絶対パスを使用しており、それ以外の場合は呼び出しが不要であるように思われるため、への呼び出しを削除しました。

于 2013-02-25T22:06:02.660 に答える
1

os.makedirs(path1)初めて呼び出されたときiは、すでにインクリメントされています。foror ループを使用すると、コードがクリーンになるだけでなく、より正確になります。

于 2013-02-25T21:44:59.847 に答える
0

問題はi、内側のwhileループに入る前にすでにインクリメントされていることです。i = i+1これは、ループで最後に実行されるように行を移動することで修正できwhile i <= 2ます。

ただし、より良い解決策は、forループを使用することです。

for i in range(1, 3):
    path = r'C:/Users/TEvans/Desktop/Testing/slope%d' % i 
    if not os.path.exists(path): os.makedirs(path)
    os.chdir(path)
    for j in range(1, 4):
        path1 = r'C:/Users/TEvans/Desktop/Testing/slope%d/r%d' % (i, j)
        if not os.path.exists(path1): os.makedirs(path1)
于 2013-02-25T21:48:14.887 に答える
0

問題はループ構造にあります。これでうまくいくはずです:

import subprocess, os

for i in range(0,2):
    path = r'C:/Users/TEvans/Desktop/Testing/slope%d' % i 
    if not os.path.exists(path): os.makedirs(path)
    os.chdir(path)
    for j in range(0,3):
        path1 = r'C:/Users/TEvans/Desktop/Testing/slope%d/r%d' % (i, j)
        if not os.path.exists(path1): os.makedirs(path1) 

'for' コンストラクトは、コード フラグメントの場合のように、その間のどこかではなく、コード ブロック全体が実行された後にのみ変数がインクリメントされることを保証します。

于 2013-02-25T21:50:02.600 に答える