MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Pythonの基礎 - ディレクトリのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Pythonの基礎 - ディレクトリ
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Pythonでは、ディレクトリに含まれるファイルの一覧を取得したり、ディレクトリ名を変更したりすることができる。<br> <br><br> == ディレクトリの作成 / 削除 == ==== ディレクトリの作成 ==== ディレクトリを新規作成する場合は、<code>mkdir</code>関数を使用する。<br> <br> <code>mkdir</code>関数は、第1引数に指定したパスが示すディレクトリを新規作成する。<br> 省略可能な第2引数には、新規作成するディレクトリの権限を設定する。(省略された場合、8進数で<code>0o777</code>が設定される)<br> <syntaxhighlight lang="python"> os.mkdir(path, mode = 0o777, *, dir_fd = None) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import os path = './test/movie' os.mkdir(path) </syntaxhighlight> <br> <u>※注意</u><br> <u><code>mkdir</code>関数は、中間ディレクトリを作成することができない。</u><br> <u>例えば、/home/hoge/img/backディレクトリを作成する場合、/home/hoge/imgディレクトリが存在していない時は、例外<code>FileNotFoundError</code>が発生する。</u><br> <u>また、新規作成するディレクトリが既に存在する場合は、例外<code>FileExistsError</code>が発生する。</u><br> <br> ==== 中間ディレクトリも同時に作成する ==== 中間ディレクトリも同時に新規作成する場合、<code>os</code>モジュールの<code>makedirs</code>関数を使用する。<br> <br> 第1引数に指定したパスが示すディレクトリを新規作成する。<br> 省略可能な第2引数には、新規作成するディレクトリの権限を設定する。(省略した場合は、8進数で<code>0o777</code>が設定される)<br> 省略可能な第3引数に<code>True</code>を指定する場合、新規作成するディレクトリが既に存在してもエラーが発生しない。<br> 新規作成するディレクトリが既に存在する場合、引数を省略するか、明示的に<code>exist_ok = False</code>を指定すると例外<code>FileExistsError</code>が発生する。<br> <syntaxhighlight lang="python"> os.makedirs(name, mode = 0o777, exist_ok = False) </syntaxhighlight> <br> 以下の例では、./test/movie/backディレクトリを新規作成している。<br> ./test/movie/backディレクトリが存在しない場合でも、中間ディレクトリである./test/movieディレクトリを作成後、指定のパスのディレクトリが作成される。<br> <syntaxhighlight lang="python"> import os path = './test/movie/back' os.makedirs(path, exist_ok = True) </syntaxhighlight> <br> ==== ディレクトリの削除 ==== ファイルを削除する場合は、<code>os</code>モジュールの<code>rmdir</code>関数を使用する。<br> <br> <code>rmdir</code>関数は、第1引数に指定したパスが示すファイルを削除する。<br> <br> ただし、ディレクトリを削除する場合は、ディレクトリの中身が空である必要があることに注意する。<br> 削除するディレクトリが空ではない場合、例外<code>OSError</code>が発生する。<br> <syntaxhighlight lang="python"> os.rmdir(path *, dir_fd = None) </syntaxhighlight> <br> 存在しないファイルを削除する場合、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> import os path = './test/doc' os.rmdir(path) </syntaxhighlight> <br> ==== ディレクトリとディレクトリの中身の一括削除 ==== ディレクトリとディレクトリ内に存在するファイルを一括して削除する場合、<code>shutil</code>モジュールの<code>rmtree</code>関数を使用する。<br> <br> 第1引数に指定したパスが示すディレクトリを削除する。<br> ディレクトリ内にファイルやディレクトリが含まれている場合は、一括削除する。<br> <syntaxhighlight lang="python"> shutil.rmtree(path, ignore_errors = False, onerror = None) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import shutil path = './test/movie' shutil.rmtree(path) </syntaxhighlight> <br><br> == ディレクトリの作成 / 削除 (pathlibモジュールの使用) == ==== ディレクトリの作成 (pathlibモジュールの使用) ==== ディレクトリを新規作成する場合は、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>mkdir</code>メソッドを使用する。<br> <br> 省略可能な第1引数には、新規作成するディレクトリの権限を設定する。(省略された場合は、8進数で<code>0o777</code>が設定される) 省略可能な第2引数に<code>True</code>を指定する場合、中間ディレクトリを自動的に作成する。 省略可能な第3引数に<code>True</code>を指定する場合、新規作成するディレクトリが存在していてもエラーにはならない。 <syntaxhighlight lang="python"> Path.mkdir(mode=0o777, parents=False, exist_ok=False) </syntaxhighlight> <br> 以下の例では、新規作成するディレクトリを示すパスから<code>Path</code>クラスのインスタンスを生成した後、<code>mkdir</code>メソッドを使用している。<br> <code>mkdir</code>メソッドは中間ディレクトリを自動的に作成するため、中間ディレクトリである./testディレクトリが存在しない場合は、<br> ./testディレクトリを作成した後、指定のパスのディレクトリを作成する。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/back') p.mkdir(parents = True) </syntaxhighlight> <br> ==== ディレクトリの削除 (pathlibモジュールの使用) ==== ディレクトリを削除する場合、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>rmdir</code>メソッドを使用する。<br> <br> ただし、ディレクトリは空である必要がある。<br> 削除するディレクトリが空ではない場合、例外<code>OSError</code>が発生する。<br> <syntaxhighlight lang="python"> Path.rmdir() </syntaxhighlight> <br> 以下の例では、削除するディレクトリを示すパスから<code>Path</code>クラスのインスタンスを作成した後、<code>rmdir</code>メソッドを使用している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/movie') p.rmdir() </syntaxhighlight> <br><br> == ディレクトリの存在確認 == 指定したパスが示すディレクトリが存在するかどうかを確認する場合、<code>os.path</code>モジュールの<code>exists</code>関数を使用する。<br> <br> 引数に指定したパスが存在する場合は、<code>True</code>を返す。<br> また、<code>exists</code>関数は、引数に指定したパスがファイルまたはディレクトリであっても存在する場合は、<code>True</code>を返すことに注意する。<br> <syntaxhighlight lang="python"> os.path.exists(path) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import os import pathlib path1 = './test/address.txt' if os.path.exists(path1) : print(path1 + 'は存在します') else : print(path1 + 'は存在しません') path2 = './test/user.txt' if os.path.exists(path2) : print(path2 + 'は存在します') else : print(path2 + 'は存在しません') # 出力 True </syntaxhighlight> <br> 引数に指定されたパスにおいて、ファイルまたはディレクトリを判別するには、[[Pythonの基礎 - ファイル#ファイルとディレクトリの判別]]を参照すること。<br> <br><br> == ディレクトリの存在確認 (pathlibモジュールの使用) == 指定したパスが示すディレクトリが存在するかどうかを確認する場合、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>exists</code>メソッドを使用する。<br> <br> パスが示すディレクトリが存在する場合は、Trueを返す。<br> また、<code>Path</code>クラスの<code>exists</code>メソッドは、引数に指定したパスがファイルまたはディレクトリであっても存在する場合は、<code>True</code>を返すことに注意する。<br> <syntaxhighlight lang="python"> Path.exists() </syntaxhighlight> <br> ディレクトリの存在を確認するには、まず、存在を確認するファイルのパスから<code>Path</code>クラスのインスタンスを生成した後、<code>exists</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> import pathlib path1 = './test/address.txt' p1 = pathlib.Path(path1) if p1.exists() : print(path1 + 'は存在します') else : print(path1 + 'は存在しません') path2 = './test/user.txt' p2 = pathlib.Path(path2) if p2.exists() : print(path2 + 'は存在します') else : print(path2 + 'は存在しません') </syntaxhighlight> <br><br> == ディレクトリ名の変更 == ディレクトリ名を変更する場合は、<code>os</code>モジュールの<code>rename</code>関数を使用する。<br> <syntaxhighlight lang="python"> os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) </syntaxhighlight> <br> 第1引数に指定したパスが示すディレクトリ名を、第2引数に指定したパスが示すディレクトリ名に変更する。<br> <br> ディレクトリ名を変更する場合、変更前と変更後でディレクトリの親ディレクトリが異なっていても問題ない。<br> ただし、ディレクトリ名を変更する時、変更後の親ディレクトリが存在しない場合、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> import os oldpath1 = './test/book' newpath1 = './test/memo' os.rename(oldpath, newpath) </syntaxhighlight> <br> Windows環境の場合、変更後のパスが既に存在する場合、例外<code>FileExistsError</code>が発生する。<br> <syntaxhighlight lang="python"> import os oldpath = './test/book' newpath = './back/memo' os.rename(oldpath, newpath) # 既にmemoディレクトリが存在する場合は、例外FileExistsErrorが発生する </syntaxhighlight> <br><br> == ディレクトリの変更 (pathlibモジュールの使用) == ディレクトリ名を変更する場合は、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>rename</code>メソッドを使用する。<br> <br> パスが示すディレクトリの名前を、引数に指定したパスが示すディレクトリ名に変更する。<br> <br> ディレクトリ名を変更する場合、変更前と変更後でディレクトリの親ディレクトリが異なっていても問題ない。<br> ただし、ディレクトリ名を変更する時、変更後の親ディレクトリが存在しない場合、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> Path.rename(target) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import pathlib oldpath1 = pathlib.Path('./test/book') oldpath1.rename(pathlib.Path('./test/memo')) </syntaxhighlight> <br> Windows環境の場合、変更後のパスが既に存在する場合、例外<code>FileExistsError</code>が発生する。<br> <syntaxhighlight lang="python"> import pathlib oldpath = pathlib.Path('./test/book') oldpath.rename(pathlib.Path('./test/address')) # 既にaddressディレクトリが存在する場合は、例外FileExistsErrorが発生する </syntaxhighlight> <br><br> == 条件に一致するファイル / ディレクトリの一覧の取得 == ==== 同階層のファイル / ディレクトリの一覧の取得 ==== 指定した条件に一致するファイルやディレクトリの一覧を取得する場合は、<code>glob</code>モジュールの<code>glob</code>関数を使用する。<br> <syntaxhighlight lang="python"> glob.glob(pathname, *, recursive=False) </syntaxhighlight> <br> 第1引数に指定したパスとマッチするファイルおよびディレクトリを、リストとして取得する。<br> この時、パスには以下の特殊文字を指定することができる。<br> * : 0文字以上の任意の文字 ? : 1文字の任意の文字 [abc] : 括弧の中のいずれかの文字 <br> <code>*</code>は、0文字以上の任意の文字とマッチする。<br> 例えば、*.txtと指定する場合、a.txtやmemo.txt等の"0文字以上の任意の文字列" + ".txt"に一致するファイルおよびディレクトリの一覧を取得する。<br> <br> 以下の例では、末尾が.jpgのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/*'): print(name) # 出力 ./test/img ./test/movie ./test/pen.jpg </syntaxhighlight> <br> 以下の例では、bから始まるファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/b*'): print(name) # 出力 ./test/back ./test/book.png </syntaxhighlight> <br> <code>?</code>は、1文字の任意の文字とマッチする。<br> 例えば、?.txtと指定する場合、a.txtやc.txt等の"1文字の任意の文字" + ".txt"と一致するファイルやディレクトリの一覧を取得する。<br> 2文字以上のabc.txt等にはマッチしない。<br> <br> 以下の例では、3文字の任意の文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/???.txt'): print(name) # 出力 ./test/cup.txt ./test/pen.txt </syntaxhighlight> <br> <code>[]</code>は、括弧の中に記述した文字のいずれか1文字とマッチする。<br> 例えば、199[789].txtと指定する場合、1997.txt、1998.txt、1999.txtと一致するファイルやディレクトリの一覧を取得する。<br> 1文字ではない19978.txt等にはマッチしない。<br> <br> また、[3-6]や[a-e]等のようにハイフンを記述することにより、文字の範囲を指定することができる。<br> [3-6]は[3456]と等価、[a-e]は[abcde]と等価である。<br> <br> 以下の例では、最初にaからeまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している、<br> さらに、fからzまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/[a-e]*.txt'): print(name) for name in glob.glob('./test/[c-z]*.txt'): print(name) # 出力 ./test/book.txt ./test/environment.txt ./test/flavor.txt ./test/pen.txt </syntaxhighlight> <br> <code>glob</code>関数において、特殊文字である<code>*</code>、<code>?</code>、<code>[]</code>をを単なる文字として扱う場合は、<code>[]</code>で囲んで記述する。<br> 例えば、?を文字として扱う場合は、[?]と記述する。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/*[?]*'): print(name) # 出力 ./test/ab?cd </syntaxhighlight> <br> ==== 再帰的にファイル / ディレクトリの一覧の取得 ==== <code>glob</code>関数において、第2引数に<code>True</code>を指定することにより、特殊文字<code>**</code>が使用できる。<br> <br> パスの指定において、<code>**</code>を使用することにより、全てのファイルおよび0個以上のディレクトリとサブディレクトリにマッチする。<br> <syntaxhighlight lang="python"> glob.glob(pathname *, recursive = False) </syntaxhighlight> <br> 例えば、パスを./**/*.txtと指定する場合、a.txtやmemo.txt等の同階層のディレクトリにあるファイルの他に、<br> ./doc/b.txtや./html/back/2020/report.txt等のサブディレクトリにあるファイルも対象となる。<br> <br> 以下の例では、サブディレクトリを再帰的に検索して条件に一致するファイルを取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/**/*', recursive = True): print(name) # 出力 ./test/img ./test/movie ./test/pen.txt ./test/back ./test/back/2020.txt </syntaxhighlight> <br> ==== 条件に一致するファイルやディレクトリをイテレータとして取得 ==== <code>glob</code>関数は、条件に一致する全てのファイルやディレクトリが含まれるリストが取得できるが、<br> <code>iglob</code>関数は、条件に一致するファイルやディレクトリに順にアクセスできるイテレータを取得することができる。<br> <syntaxhighlight lang="python"> glob.iglob(pathname *, recursive = False) </syntaxhighlight> <br> 多くのファイルやディレクトリが一致するような場合は、全ての結果をまとめて取得するのではなく、逐一取得するイテレータを使用する方が実行速度が早い。<br> <syntaxhighlight lang="python"> import glob for name in glob.iglob('./test/**/*.txt', recursive=True): print(name) # 出力 ./test\book.txt ./test\cup.txt ./test\pen.txt ./test\back\2019.txt ./test\back\2020.txt ./test\back\old\2017.txt </syntaxhighlight> <br><br> == 条件に一致するファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用) == ==== 同階層のファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用) ==== 指定した条件に一致するファイルやディレクトリの一覧を取得する場合、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>glob</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> Path.glob(pattern) </syntaxhighlight> <br> <code>Path</code>クラスの<code>glob</code>メソッドは、パスが示すディレクトリおよびそのサブディレクトリに含まれるファイルやディレクトリにおいて、<br> 第1引数に指定したパターンとマッチするファイルやディレクトリへ順にアクセスできるイテレータを取得する。<br> この時、パターンには以下の特殊文字を指定することができる。<br> * : 0文字以上の任意の文字 ? : 1文字の任意の文字 [abc] : 括弧の中のいずれかの文字 <br> <code>*</code>は、0文字以上の任意の文字とマッチする。<br> 例えば、*.txtと指定する場合、a.txtやmemo.txt等の"0文字以上の任意の文字列" + ".txt"に一致するファイルおよびディレクトリの一覧を取得する。<br> <br> 以下の例では、末尾が.jpgのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('*.txt'): print(name) # 出力 ./test/a.jpg ./test/cup.jpg ./test/pen.jpg </syntaxhighlight> <br> 以下の例では、bから始まるファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('b*'): print(name) # 出力 ./test/back ./test/back/book.png </syntaxhighlight> <br> <code>?</code>は、1文字の任意の文字とマッチする。<br> 例えば、?.txtと指定する場合、a.txtやc.txt等の"1文字の任意の文字" + ".txt"と一致するファイルやディレクトリの一覧を取得する。<br> 2文字以上のabc.txt等にはマッチしない。<br> <br> 以下の例では、3文字の任意の文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('???.txt'): print(name) # 出力 ./test/cup.txt ./test/pen.txt </syntaxhighlight> <br> <code>[]</code>は、括弧の中に記述した文字のいずれか1文字とマッチする。<br> 例えば、199[789].txtと指定する場合、1997.txt、1998.txt、1999.txtと一致するファイルやディレクトリの一覧を取得する。<br> 1文字ではない19978.txt等にはマッチしない。<br> <br> また、[3-6]や[a-e]等のようにハイフンを記述することにより、文字の範囲を指定することができる。<br> [3-6]は[3456]と等価、[a-e]は[abcde]と等価である。<br> <br> 以下の例では、最初にaからeまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している、<br> さらに、fからzまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('[a-e]*.txt'): print(name) for name in p.glob('[c-z]*.txt'): print(name) # 出力 ./test/book.txt ./test/environment.txt ./test/flavor.txt ./test/pen.txt </syntaxhighlight> <br> <code>Path</code>クラスの<code>glob</code>メソッドにおいて、特殊文字である<code>*</code>、<code>?</code>、<code>[]</code>をを単なる文字として扱う場合は、<code>[]</code>で囲んで記述する。<br> 例えば、?を文字として扱う場合は、[?]と記述する。<br> <br> ==== 再帰的にファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用) ==== <code>Path</code>クラスの<code>glob</code>メソッドにおいて、パスの指定時に**を使用することにより、全てのファイルおよび0個以上のディレクトリとサブディレクトリにマッチする。<br> これは、<code>glob</code>モジュールの<code>glob</code>関数とは異なり、<code>Path</code>クラスの<code>glob</code>メソッドはデフォルトでサブディレクトリを再帰的に検索する。<br> <br> 例えば、パスを./**/*.txtと指定する場合、a.txtやmemo.txt等の同階層のディレクトリにあるファイルの他に、<br> ./doc/b.txtや./html/back/2020/report.txt等のサブディレクトリにあるファイルも対象となる。<br> <br> 以下の例では、サブディレクトリを再帰的に検索して条件に一致するファイルを取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('**/*.txt'): print(name) # 出力 ./test\book.txt ./test\cup.txt ./test\pen.txt ./test\back\2020.txt ./test\back\old\2017.txt </syntaxhighlight> <br><br> == ディレクトリに含まれるファイルとディレクトリの一覧の取得 == ==== ファイルとディレクトリの一覧の取得 ==== 指定したディレクトリに含まれるファイルとディレクトリの一覧を取得する場合、<code>os</code>モジュールの<code>listdir</code>関数を使用する。<br> <br> 引数にディレクトリを指定する時、そのディレクトリに含まれるファイル名とディレクトリ名が格納されたリストを返す。<br> ファイル名とディレクトリ名は、区別せずにリストに格納される。<br> <syntaxhighlight lang="python"> os.listdir(path='.') </syntaxhighlight> <br> <syntaxhighlight lang="python"> import os path = './test/' filelist = os.listdir(path) print(filelist) # 出力 ['address.txt', 'doc', 'img', 'name.txt'] </syntaxhighlight> <br> なお、引数に指定したディレクトリ名と取得したファイル名およびディレクトリ名を結合することによりパスを取得できるが、<br> <code>os.path</code>モジュールの<code>join</code>関数を使用した方が簡単である。<br> 複数のパスが格納されているリストを第2引数に指定することにより、ディレクトリの区切り文字(<code>/</code>または<code>\</code>)が自動的に付加されて結合した結果を返す。<br> <syntaxhighlight lang="python"> os.path.join(path, *paths) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import os path = './test/' filelist = os.listdir(path) for f in filelist: print(f) print(os.path.join(path, f)) </syntaxhighlight> <br> ==== ファイルとディレクトリの判別 ==== 指定したパスにおいて、ファイルまたはディレクトリを判別する場合、<code>os.path</code>モジュールの<code>isfile</code>関数および<code>isdir</code>関数を使用する。<br> <br> <code>isfile</code>関数は、引数に指定したパスが存在、かつ、ファイルの場合は<code>True</code>を返す。<br> <syntaxhighlight lang="python"> os.path.isfile(path) </syntaxhighlight> <br> <code>isdir</code>関数は、引数に指定したパスが存在、かつ、ディレクトリの場合は<code>True</code>を返す。<br> <syntaxhighlight lang="python"> os.path.isdir(path) </syntaxhighlight> <br> <code>isfile</code>関数と<code>isdir</code>関数は、ファイルおよびディレクトリが存在しない場合は<code>False</code>を返す。<br> <syntaxhighlight lang="python"> import os path = './test/' print(os.path.isfile(path)) print(os.path.isdir(path)) path = './test/address.txt' print(os.path.isfile(path)) print(os.path.isdir(path)) # 出力 False True True False </syntaxhighlight> <br> 以下の例では、./testディレクトリに含まれるファイルとディレクトリの一覧を取得して、ファイルの場合は[F] + ファイル名、ディレクトリの場合は[D] + ディレクトリ名を出力している。<br> <syntaxhighlight lang="python"> import os path = './test/' filelist = os.listdir(path) for f in filelist: if os.path.isfile(os.path.join(path, f)): print('[F]:' + f) else: print('[D]:' + f) </syntaxhighlight> <br> ==== ファイルおよびディレクトリに関する情報も併せて取得する ==== 指定したディレクトリに含まれるファイルとディレクトリの一覧を取得する別の方法として、<code>os</code>モジュールの<code>scandir</code>関数を使用する。<br> <br> <code>os</code>モジュールの<code>scandir</code>関数は、引数にパスを指定する時、そのパスに含まれるファイルまたはディレクトリに関する情報を持つ<code>os.DirEntry</code>オブジェクトのイテレータを返す。<br> この情報は、ファイル名やディレクトリ名、ファイルまたはディレクトリの判別、ファイルのサイズ、タイムスタンプ等の情報を持つ。<br> <br> <code>os.DirEntry</code>クラスの<code>name</code>属性を参照することによりファイル名またはディレクトリ名を取得することができ、<code>path</code>属性を参照することによりパスを取得することができる。<br> <syntaxhighlight lang="python"> os.scandir(path = '.') </syntaxhighlight> <br> 以下の例では、イテレータから要素を1つ取り出してファイル名とパスをそれぞれ出力している。<br> <syntaxhighlight lang="python"> import os path = './test/' itr = os.scandir(path) f = next(itr) print(f.name) print(f.path) # 出力 address.txt ./test/address.txt </syntaxhighlight> <br> また、<code>os.DirEntry</code>クラスの<code>is_file</code>メソッド、および、<code>is_dir</code>メソッドを使用することにより、ファイルおよびディレクトリを判別することができる。<br> <br> <code>os.DirEntry</code>クラスの<code>is_file</code>メソッドは、ファイルが存在、かつ、ファイルまたはファイルへのシンボリックリンクである場合に<code>True</code>を返す。<br> <syntaxhighlight lang="python"> is_file(*, follow_symlinks = True) </syntaxhighlight> <br> <code>os.DirEntry</code>クラスの<code>is_file</code>メソッドは、ディレクトリが存在、かつ、ディレクトリまたはディレクトリへのシンボリックリンクである場合に<code>True</code>を返す。<br> <syntaxhighlight lang="python"> is_dir(*, follow_symlinks = True) </syntaxhighlight> <br> 以下の例では、イテレータから要素を1つ取り出して、ファイル名またはディレクトリ名を出力、および、ファイルまたはディレクトリの判別をしている。<br> <syntaxhighlight lang="python"> import os path = './test/' itr = os.scandir(path) f = next(itr) print(f.name) print(f.is_file()) print(f.is_dir()) # 出力 address.txt True False </syntaxhighlight> <br> 以下の例では、./testディレクトリに含まれるファイルとディレクトリの一覧を取得して、<br> ファイルの場合は[F] + ファイル名 + パス、ディレクトリの場合は[D] + ディレクトリ名 + パスを出力している。<br> <syntaxhighlight lang="python"> import os path = './test/' for i in os.scandir(path): if i.is_file(): print('[F]:' + i.name + ' ' + i.path) else: print('[D]:' + i.name + ' ' + i.path) </syntaxhighlight> <br><br> == ディレクトリに含まれるファイルとディレクトリの一覧の取得 (pathlibモジュールの使用) == ==== ファイルとディレクトリの一覧の取得 (pathlibモジュールの使用) ==== 指定したディレクトリに含まれるファイルとディレクトリの一覧を取得する場合、<code>pathlib</code>にある<code>Path</code>クラスの<code>iterdir</code>メソッドを使用する。<br> <br> ディレクトリに含まれるファイルやディレクトリを表す<code>Path</code>クラスのオブジェクトのイテレータを返す。<br> <syntaxhighlight lang="python"> Path.iterdir() </syntaxhighlight> <br> 以下の例では、イテレータから要素を1つ取り出してパスを出力している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/') itr = p.iterdir() childp = next(itr) print(childp) # 出力 address.txt </syntaxhighlight> <br> 以下の例では、指定したパスに含まれるファイル名およびディレクトリ名と、それぞれのパスを取得して画面に出力している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/') for i in p.iterdir(): print(i) </syntaxhighlight> <br> ==== ファイルとディレクトリの判別 (pathlibモジュールの使用) ==== 指定したパスにおいて、ファイルまたはディレクトリを判別する場合、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>is_file</code>関数および<code>is_dir</code>メソッドを使用する。<br> <br> <code>is_file</code>メソッドは、引数に指定したパスが存在、かつ、ファイルの場合は<code>True</code>を返す。<br> <syntaxhighlight lang="python"> Path.is_file() </syntaxhighlight> <br> <code>is_dir</code>メソッドは、引数に指定したパスが存在、かつ、ディレクトリの場合は<code>True</code>を返す。<br> <syntaxhighlight lang="python"> Path.is_dir() </syntaxhighlight> <br> <code>is_file</code>メソッドと<code>is_dir</code>メソッドは、ファイルおよびディレクトリが存在しない場合は<code>False</code>を返す。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/') for i in p.iterdir(): if i.is_file(): print(str(i) + ' is File') else: print(str(i) + ' is Directory') # 出力 False True True False </syntaxhighlight> <br> 以下の例では、./testディレクトリに含まれるファイルとディレクトリの一覧を取得して、ファイルの場合は[F] + ファイル名、ディレクトリの場合は[D] + ディレクトリ名を出力している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/') for i in p.iterdir(): if i.is_file(): print('[F]:' + str(i)) else: print('[D]:' + str(i)) </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Python]]
Pythonの基礎 - ディレクトリ
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse