質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

830閲覧

pythonでフォルダ名に親フォルダ名を紐付けて出力したいです。

daphnia99

総合スコア24

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/07/02 14:47

【実現したいこと】
初心者です。python3を使って、フォルダ名と親フォルダ名の一覧を取得、出力したいです。

【わからないこと】
あるフォルダに格納されたフォルダ一覧(doc1~3,・・・)を取得することはできたのですが、どうやってフォルダ一覧に親フォルダ(dir1~3)名を紐付ければよいでしょうか。

【実現したいこと詳細】
具体的には、あるディレクトリDirの中に、dir1dir3があったとします。さらにdir1にはdoc1,doc2,doc3というフォルダが格納されているとします。dir23にも同様に下の階層があり幾つかのフォルダがあるとします。これらのフォルダ名を下記出力イメージのようにcsvなどで出力したいです。

●フォルダ構成
Dir
|_dir1_______doc1
|_dir2 |_doc2
|_dir3 |_doc3

●出力イメージ
dir1 doc1
dir1 doc2
dir1 doc3
dir2 doc●
dir2 doc■
dir3 doc▲


【やってみたこと】

import os #パス入力(test内にdir1~3が格納されている) path = r'C:\Users\name\Desktop\test' folder_list = [] #パスで指定した親フォルダ内のフォルダ名を順にとりだしてリストにする。 folders = os.listdir(path) for folder in folders : inside_path = path + "\" +folder folder_list.append(os.listdir(inside_path)) #とりあえずテキストに出力ではなくprintにしてます。ネストされた子フォルダのリストが生成されました。 print(folder_list)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず os.walk() を使用することにより、指定したフォルダ内にあるフォルダ名を走査し、フォルダ名をPATH付きで得るにことが出来ます。
この時に、os.path.relpath() を使用することで、指定フォルダからの相対PATHに変換することがです。

Python

1import os 2 3startpath = r'C:\Users\name\Desktop\test' 4 5folder_list = [] 6for root, dirs, files in os.walk(startpath): 7 # startpath からの相対パスに変換 8 rel_path = os.path.relpath(root, startpath) 9 # 子のフォルダリストが空だったらリストに追加 (この仕様でよいの??) 10 if not dirs: 11 folder_list.append(path2list(rel_path)) 12 13print(folder_list) 14# => ['dir1/doc1', 'dir1/doc2', 'dir1/doc3', 'dir2/doc4', 'dir2/doc5', 'dir2/doc6', 'dir3/doc7', 'dir3/doc8', 'dir3/doc9']

これでほぼ目的は達せられていると思いますが、表示などに自由度を持たせたいときなどはos.path.split()を再帰的に使用して上記の相対PATHをリスト形式に分割することができます。

Python

1import os 2 3def path2list(path): 4 folders = [] 5 while True: 6 path, folder = os.path.split(path) 7 if folder: 8 folders.append(folder) 9 else: 10 if path: 11 folders.append(path) 12 break 13 return folders[::-1] 14 15 16lst = path2list('dir1/dir2/dir3') 17print(lst) 18# => ['dir1', 'dir2', 'dir3']

これら2つを組み合わせると

Python

1import os 2 3def path2list(path): 4 folders = [] 5 while True: 6 path, folder = os.path.split(path) 7 if folder: 8 folders.append(folder) 9 else: 10 if path: 11 folders.append(path) 12 break 13 return folders[::-1] 14 15 16startpath = r'C:\Users\name\Desktop\test' 17 18folder_list = [] 19for root, dirs, files in os.walk(startpath): 20 # startpath からの相対パスに変換 21 rel_path = os.path.relpath(root, startpath) 22 # 子ディレクトリを持っていなかったらリストに追加 23 if not dirs: 24 folder_list.append(path2list(rel_path)) 25 26print(folder_list) 27# => [['dir1', 'doc1'], ['dir1', 'doc2'], ['dir1', 'doc3'], ['dir2', 'doc4'], ['dir2', 'doc5'], ['dir2', 'doc6'], ['dir3', 'doc7'], ['dir3', 'doc8'], ['dir3', 'doc9']]

となりますので、あとは適当に表示を行ってください。

Python

1for f in folder_list: 2 print(' -> '.join(f)) 3# => dir1 -> doc1 4 dir1 -> doc2 5 dir1 -> doc3 6 dir2 -> doc4 7 dir2 -> doc5 8 dir2 -> doc6 9 dir3 -> doc7 10 dir3 -> doc8 11 dir3 -> doc9

投稿2017/07/04 09:04

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daphnia99

2018/02/25 11:50

遅くなり申し訳ありません。 誠にありがとうございました。
guest

0

フォルダ一覧(doc1~3,・・・)を取得することはできた

あと少しです!

Pythonで再帰的にファイル・ディレクトリを探して出力する
CSV生成

こちらが参考になりませんか?

上のリンク先で言うprint file部分を配列に格納して、その後に下のリンク先で言うwriter.writerows(rows)をしたら良いですね。

投稿2017/07/02 21:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問