Pythonを使うとフォルダ内の全てフォルダやファイル名を取得して一覧にすることができます。
これは下位フォルダの内のファイルも含めて取得可能です。
今回は、フォルダ内の全てのPDFの全ページに透かしを入れていくプログラムを紹介します。
・テキストに階層ごとに書き込む
それでは以下で詳しく紹介していきます。
目次
指定フォルダ内の全フォルダ・全ファイルをテキストに出力するプログラムの概要
今回は以下の作業をpythonで行うことを目指します。
1.フォルダ内のフォルダやファイルを取得する
2.取得対象がフォルダの場合、その下位のフォルダやファイルを取得する
3.取得したフォルダやファイルの名前をテキストに書き込む
詳しいプログラム解説は後半で行います。
Pythonプログラムを実行するための準備
事前の準備としてpathlibを使えるようにライブラリ設定をします。
準備|pathlibモジュールのインストール
pip install pathlib
今回はpathlibで、フォルダ内に存在するファイルやフォルダを全部取得します。
Pythonプログラム解説
この記事で紹介するプログラムを解説しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#プログラム1|ライブラリの設定 import pathlib import os #プログラム2|mainプロシージャ def main(): Folderpath = os.getcwd()#対象フォルダを指定 outputpath = 'list.txt'#テキストファイルを作成 f = open(outputpath, mode='w')#テキストファイルを書き込みモードで開く GetFolderFileNames(Folderpath, 0, f)#GetFolderFileNames(プログラム3)を呼び出す #プログラム3|階層ごとのフォルダやファイルを書き出す関数 def GetFolderFileNames(path, kaiso, f): files = pathlib.Path(path).glob('*')#その階層のフォルダやファイルを取得 # プログラム4|フォルダやファイルを一つずつ書き出す for file in files: output = '\t' * kaiso + file.name + '\n' f.write(output) # プログラム5|フォルダの場合、その下の階層のフォルダやファイルをGetFolderFileNames(プログラム6)を呼び出す if file.is_file() == False: GetFolderFileNames(file, kaiso+1, f) #プログラム6|mainを呼び出す if __name__ == "__main__": main() |
以下で詳しく説明しています。
プログラム1|ライブラリの設定
1 2 3 |
#プログラム1|ライブラリの設定 import pathlib import os |
1 2 3 |
# プログラム解説 ・pathlib|フォルダ内のフォルダやファイルを取得 ・os|Pythonファイルが保存されているフォルダを取得 |
プログラム2|mainプロシージャ(フォルダとファイルを取得)
1 2 3 4 5 6 7 8 |
#プログラム2|mainプロシージャ(フォルダとファイルを取得) def main(): Folderpath = os.getcwd() outputpath = 'list.txt' f = open(outputpath, mode='w') GetFolderFileNames(Folderpath, 0, f) |
1 2 3 4 5 6 7 8 |
#プログラム解説 mainプロシージャ、()内の文言がないため引数なし 対象フォルダを指定 テキストファイルを作成 テキストファイルを書き込みモードで開く GetFolderFileNames(プログラム3)を呼び出す |
ここでは便宜上、対象フォルダをPythonファイルが保存されているフォルダとしています。
しかしながら、場合によっては、Pythonファイルが保存されているフォルダ以外を調べたいときもあるはずです。
その場合は、「Folderpath = r’C:\Users\xxx\Dropbox\Python\Program’」というようにフルパスを記載することで対応可能です。
f = open(outputpath, mode=’w’)
取得するフォルダやファイル名を書き込むためのテキストファイルを開きます。
ここでは「mode=’w’」とすることで書き込みモードで開くことができます。
これでプログラム3を呼び出します。
Folderpathは調査したいフォルダ、fはテキストファイルで、それぞれを引数としてプログラム3へ渡します。
プログラム3では、引数として受け取った値を活用できるようになります。
プログラム3|階層ごとのフォルダやファイルを書き出す関数
1 2 3 |
#プログラム3|階層ごとのフォルダやファイルを書き出す関数 def GetFolderFileNames(path, kaiso, f): files = pathlib.Path(path).glob('*') |
1 2 3 |
# プログラム解説 関数 GetFolderFileNames(引数としてpath, kaiso, f) 変数filesにpathで指定したフォルダに含まれるフォルダやファイルを取得 |
変数filesにpathで指定したフォルダ内の全てのファイルとフォルダを取得します。
ここではPythonプログラムがあるフォルダを画像で紹介していますが、再帰的に動かすことで全てのフォルダを調査します。
プログラム4|フォルダやファイルを一つずつ書き出す
1 2 3 4 |
# プログラム4|フォルダやファイルを一つずつ書き出す for file in files: output = '\t' * kaiso + file.name + '\n' f.write(output) |
1 2 3 4 |
# プログラム解説 変数filesに含まれるフォルダやファイルを一つずつ調査 変数outputを「(tabスペース)× kaiso(階層分) + file.name + 改行」とする テキストファイルにoutputを書き込む |
「\t」はtabスペースを指します。このtabスペースをkaiso(フォルダ階層分)を掛け算することで、テキストファイルを見たときに階層構造が分かるようにします。
「file.name」はフォルダやファイル名を取得します。
「\n」は改行を指します。最後に入れることで、テキストファイルに書き出したときに改行を挿し込むことができます。
プログラム5|フォルダの場合、その下の階層のフォルダやファイルをGetFolderFileNames(プログラム3)を呼び出す
1 2 3 |
# プログラム5|フォルダの場合、その下の階層のフォルダやファイルをGetFolderFileNames(プログラム3)を呼び出す if file.is_file() == False: GetFolderFileNames(file, kaiso+1, f) |
1 2 3 |
# プログラム解説 対象がフォルダであれば GetFolderFileNames(プログラム3)を呼び出して、下位階層のフォルダやファイルを調べる |
「変数fileの対象が、ファイルでなければ」としています。
これはすなわち、「対象がフォルダだったら」の言い換えです。
なぜなら「ファイルorフォルダ」の二択だからです。
対象がフォルダであれば、プログラム3を呼び出して、下位フォルダに含まれるフォルダやファイルや確認していきます。
このとき、「kaiso+1」とすることで、テキストファイルに書き出されたとき、1tabスペース分のインデントをずらすことができます。
このように再帰的に呼び出すことで、全てのフォルダとファイルを調査することができるわけです。
プログラム6|mainを呼び出す
1 2 3 |
#プログラム6|mainを呼び出す if __name__ == "__main__": main() |
1 2 3 |
# プログラム解説 もしmainというプログラムがあれば main()を呼び出す |
プログラムの解説はここまでです。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。