0

ねえ、これは私が最近PythonのファイルとOSの部分に入ろうとするのは初めてです。ディレクトリを検索してから、すべてのサブディレクトリを見つけようとしています。ディレクトリにフォルダがない場合は、すべてのファイルをリストに追加します。そして、それらすべてをdictで整理します。

たとえば、木は次のようになります

  • 開始パス
    • 方向1
      • サブディレクトリ1
      • サブディレクトリ2
      • サブディレクトリ3
        • サブサブディレクトリ
          • file.jpg
          • folder1
            • file1.jpg
            • file2.jpg
          • folder2
            • file3.jpg
            • file4.jpg

サブサブディレクトリにファイルが含まれている場合でも、フォルダが含まれているためスキップする必要があります。

これで、os.listdirとos.path.isdirを使用して、検索するディレクトリの数がわかっていれば、通常これを実行できます。ただし、これを動的にしたい場合は、任意の数のフォルダーとサブフォルダーを補正する必要があります。os.walkを使ってみましたが、すべてのファイルが簡単に見つかります。私が抱えている唯一の問題は、ファイルを含むパス名を使用してすべてのdictを作成することです。開始パスまで、dictで整理されたフォルダー名が必要です。

したがって、最終的に、上記の例を使用すると、dictはファイルを含む次のようになります。

dict['dir1']['subdir3']['subsubdir']['folder1'] = ['file1.jpg', 'file2.jpg']

dict['dir1']['subdir3']['subsubdir']['folder2'] = ['file3.jpg', 'file4.jpg']

情報を整理する上で、これまたはより良いアイデアについての助けをいただければ幸いです。ありがとう。

4

3 に答える 3

4

多分あなたは次のようなものが欲しい:

def explore(starting_path):
  alld = {'': {}}

  for dirpath, dirnames, filenames in os.walk(starting_path):
    d = alld
    dirpath = dirpath[len(starting_path):]
    for subd in dirpath.split(os.sep):
      based = d
      d = d[subd]
    if dirnames:
      for dn in dirnames:
        d[dn] = {}
    else:
      based[subd] = filenames
  return alld['']

たとえば、次の/tmp/aような が与えられた場合:

$ ls -FR /tmp/a
b/  c/  d/

/tmp/a/b:
z/

/tmp/a/b/z:

/tmp/a/c:
za  zu

/tmp/a/d:

print explore('/tmp/a')放出する: {'c': ['za', 'zu'], 'b': {'z': []}, 'd': []}.

これがあなたの求めているものと正確に一致しない場合は、違いがどうあるべきかを具体的に示してもらえますか? 必要に応じて、おそらく簡単に修正できると思います。

于 2009-12-10T06:27:11.303 に答える
1

データを構造化する方法には基本的な問題があります。dir1/subdir1サブディレクトリとファイルが含まれている場合dict['dir1']['subdir1']、リストまたは辞書にする必要がありますか?それを使用してさらにサブディレクトリにアクセスする...['subdir2']には、辞書である必要がありますが、その一方でdict['dir1']['subdir1']、ファイルのリストを返す必要があります。

これらの2つの側面を何らかの方法で組み合わせたカスタムオブジェクトからツリーを構築するか、ファイルを異なる方法で処理するようにツリー構造を変更する必要があります。

于 2009-12-10T02:41:40.497 に答える
1

なぜあなたがこれをしたいのかわかりません。を使用して処理を実行できるはずですos.path.walkが、そのような構造が本当に必要な場合は、次のことを実行できます (テストされていません)。

import os

def dirfunc(fdict, dirname, fnames):
    tmpdict = fdict
    keys = dirname.split(os.sep)[:-1]
    for k in keys:
        tmpdict = tmpdict.setdefault(k, {})

    for f in fnames:
        if os.path.isdir(f):
            return

    tmpdict[dirname] = fnames

mydict = {}
os.walk(directory_to_search, dirfunc, mydict)

dictまた、変数は Python 組み込みであるため、名前を付けないでください。名前を Python の型以外のものに再バインドすることは非常に悪い考えです。dictdict

編集:「ダブルラストキー」エラーを修正し、使用するように編集しましたos.walk

于 2009-12-10T03:31:49.707 に答える