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