-2

仕事をするためのアルゴリズムを探しています。基本的に、ソース ディレクトリであるユーザーから入力を取得します。2 つの異なる辞書を作成したいと考えています。1 つはフォルダーのサブフォルダーを保持し、もう 1 つはフォルダーのファイルを保持します。例えば:

内部にlog.txtという名前のテキストファイルと3つのサブフォルダー、folder1、folder2、およびfolder3を含むフォルダー「フォルダー」があります。folder2 内には、txt1.txt という名前の別のテキスト ファイルとサブフォルダーという名前の別のフォルダーがあり、このサブフォルダーには pic.png という名前の画像があります。

folder->log.txt, folder1, folder2->(txt.txt, subfolder->pic.png), folder3

私が欲しいのは、次のような辞書です。

folders = {'folder1':'', 'folder2': 'subfolder', folder3}
files = {'log.txt':'', 'txt.txt': 'folder2', 'pic.png':'folder2/subfolder'}

一般に、必要なのは、フォルダーとサブフォルダーの明確な辞書であり、フォルダーとサブフォルダーを正しく作成した後で簡単に作成できるようにするためです。次に、ファイルの辞書で、ファイルが所有する場所を明確にします。ファイルの辞書の構造が違っていても構いませんが、その方が簡単で早いと思います。前もって感謝します。

編集:Python 3でMac OS Xを実行しています

編集2:

dirs = [d for d in os.listdir(source) if os.path.isdir(os.path.join(source, d))]

for folder in dirs:
    tmp_source = source + folder
    dirs2 = [d for d in os.listdir(tmp_source) if os.path.isdir(os.path.join(tmp_source, d))]
    if dirs2 != []:
       print('Folder: ', dirs2, 'is not empty')

    dic[folder] = dirs2
4

1 に答える 1

2

以下のコードは、ルート フォルダーを再帰的に調べ、各フォルダー (ルート フォルダーを含む) のファイル名をキーをフォルダー パスとしてディクショナリに保存します。

import os

root_folder = r'C:\Users\Steinar\Google Drive\Kode\Ymse\test\test'
content = {}

for root, dirs, files in os.walk(root_folder):
    for subdir in dirs:
        content[os.path.join(root, subdir)] = []
    content[root] = files

# Print out the content dict    
for folder, filenames in content.items():
    print 'Folder: {}'.format(folder)
    print 'Filenames:'
    for filename in filenames:
        print '-> {}'.format(filename)

上記の入力により、このスクリプトは正しいフォルダー構造を出力します。

Folder: C:\Users\Steinar\Google Drive\Kode\Ymse\test\test\test2
Filenames:
-> test2.txt
Folder: C:\Users\Steinar\Google Drive\Kode\Ymse\test\test
Filenames:
-> test.txt
Folder: C:\Users\Steinar\Google Drive\Kode\Ymse\test\test\test2\test3\test4
Filenames:
Folder: C:\Users\Steinar\Google Drive\Kode\Ymse\test\test\test2\test3
Filenames:
-> test3.txt

フォルダー構造を再構築したい場合は、 を反復処理してcontent.keys()、各フォルダーを作成するだけです。

于 2013-11-09T14:19:10.163 に答える