OS上のファイルやフォルダ(ディレクトリ)の作成・削除などの操作についてまとめる。表的な操作は下記の通りである。
基本的に使用するライブラリー(モジュール)は、os, shutilであり、datetimeを使うと便利な場合がある。
- フォルダの作成
- フォルダの削除
- フォルダ・ファイルの有無の確認
- ファイルの作成
- ファイルの削除
- ファイル名から拡張子を取り出す
- フルパス・相対パスのファイル名からファイル名のみを取り出す
- フルパス・相対パスのファイル名からファイルがある場所までのパスのみを取り出す
- 今実行しているpyファイルまでのパスを取得する
- 参考
1. フォルダの作成
makedirs(): make directories 関数: 第1引数で指定したフォルダ(ディレクトリ)がなければ作成
# コード
import os
import datetime
time_start = datetime.datetime.now()
save_path_base = r"C:\Users\serpent\Documents\PythonScripts\test\\"
save_path = save_path_base + time_start.strftime("_%Y%m%d_%H%M%S") + r"\\" # datetimeを利用してフォルダ名を日時にする
os.makedirs(save_path_base, exist_ok=True) # 指定のフォルダをなければ作成
os.makedirs(save_path, exist_ok=True)
2. フォルダの削除
フォルダの削除は基本的にはプログラム上で行わない方が良い。必要な場合は検証環境を整えてから行うこと。
# コード
import shutil
shutil.rmtree(save_path) # ファイルは指定できないので注意。フォルダのみ指定可能で中身も削除される。
3. フォルダ・ファイルの有無の確認
os.path.isdir() と os.path.isfile(): 引数のパスを指定すると、存在の有無を確認してくれる。戻り値(return)はbool値。存在するならTrue、存在しないならFalseを返す。
※戻り値とは数学で言うところの計算結果みたいなもの。ex) f(x) = x2+2x+1のとき、引数x=1を入れると、戻り値はf(1)=4。
# コード
file_test = save_path + r"file_test.txt"
if os.path.isdir(save_path) == True:
print(r"指定のフォルダは存在します")
elif os.path.isdir(save_path) == False:
print(r"指定のフォルダは存在しません")
if os.path.isfile(file_test) == True:
print(r"指定のファイルは存在します")
elif os.path.isfile(file_test) == False:
print(r"指定のファイルは存在しません")
4. ファイルの作成
open()で第1引数のパスのファイルを第2引数のモード(r:読み取り, w:書き込み, rw:読み書き)で開く。write()などで編集、close()でファイルを閉じる。という手順が必要。割とどのプログラミング言語でも同じような手順が存在する。
# コード
path_fp = save_path + 'file_open_write.txt'
fp = open(path_fp, 'w')
fp.write('test_hello_world')
fp.close()
5. ファイルの削除
2節と同様に使用は推奨しない。なお、存在するパスを指定する必要がある。存在しないファイルへのパスだとエラーが発生するため、例外処理も必要。
# コード
path_fp = save_path + 'file_open_write.txt'
os.remove(path_fp)
6. ファイル名から拡張子を取り出す
一般のファイルには os.path.splitext()が使える。引数にファイルパスを入れるだけで拡張子が得られる。また、画像ファイルの場合には、format()が使用できる。引数のとり方がややこしいので注意が必要。
# コード
import os
name_extention = os.path.splitext('data_01.txt')
# コード
from PIL import Image
path_tiff_tm_01 = r"C:\Users\serpent\Documents\PythonScripts\test\image01.tif"
img_error = Image.open(path_tiff_tm_01)
name_extention = img_error.format
7. フルパス・相対パスのファイル名からファイル名のみを取り出す
os.path.basename(): これも引数にファイルパスを入れるだけ。
# コード
path_fp = save_path + 'file_open_write.txt'
name_base_01 = os.path.basename(path_fp)
8. フルパス・相対パスのファイル名からファイルがある場所までのパスのみを取り出す
os.path.dirname(): これも引数にファイルパスを入れるだけ。
# コード
path_fp = save_path + 'file_open_write.txt'
name_base_02 = os.path.dirname(path_fp)
9. 今実行しているpyファイルまでのパスを取得する
実行しているpyファイルのフルパスは、実は予約語 __file__ に格納されている。
# コード
name_base_03 = os.path.dirname(__file__)
10. 参考
下記リンクがわかりやすくまとまっている。
https://reffect.co.jp/python/file-folder-management
EOF