6. File-ファイル操作
以下のモジュールをインポートする。
import os
import glob
import shutil
使用するファイルパス
FULL_PATH = 'X:\\dev\\python\\test1.txt'
DIR_PATH = 'X:\\dev\\python\\'
GLOB_PATH = './*.csv'
FILE_PATH = 'test1.txt'
TEST_DUMMY_PATH = 'X:\\dev\\python\\dummy.xxx'
ディレクトリ名取得(os.path.dirname)
引数としてフルパスを渡し、そのディレクトリ部分の情報を取得する
os.path.dirname(FULL_PATH)
==> 'X:\\dev\\python'
ファイル一覧取得(glob.glob)
指定した条件に基づいたファイルの一覧をリスト形式で取得。 この場合は、実行ディレクトリ直下にある *.csv ファイル。
glob.glob(GLOB_PATH)
==> ['.\\dataframe_csv_test.csv', '.\\dataframe_csv_test_cp932.csv', '.\\dataframe_out_test.csv']
ファイルパス生成(os.path.join)
ファイルパス文字列の作成。 ディレクトリ名とファイル名を結合。区切り記号「\」は自動的に挿入してくれる。 Unixであれば「/」が入る。
os.path.join(DIR_PATH, FILE_PATH)
==> 'X:\\dev\\python\\test1.txt'
パスをディレクトリとファイルに分割(os.path.split)
os.path.split(FULL_PATH)
==> ('X:\\dev\\python', 'test1.txt')
ファイル名のみ取得(os.path.basename)
os.path.basename(FULL_PATH)
==> 'test1.txt'
ファイル名を本体と拡張子に分割(os.path.splitext)
os.path.splitext(FILE_PATH)
==> ('test1', '.txt')
下記も同じ結果(引数にはフルパスを指定)
os.path.splitext(os.path.basename(FULL_PATH))
本体部分のみ取得したい場合は
os.path.splitext(FILE_PATH)[0]
==> 'test1'
拡張子のみ取得したい場合は
os.path.splitext(FILE_PATH)[1]
==> '.txt'
ディレクトリ作成(os.mkdir)
os.mkdir('test1')
ファイル書込
実行ディレクトリにtest.txtというファイルを作成、「TEST」という文字列を書き込む。
with open(FULL_PATH, 'w') as fp:
fp.write('TEST')
ファイル読込
test.txtというファイルを読込み、その内容を表示。
with open(FULL_PATH, 'r') as fp:
print(fp.read())
==> TEST
ファイルの最終更新日時(os.path.getmtime)
取得されるのは、エポック (time モジュールを参照) からの経過秒数を与える浮動小数点数。
os.path.getmtime(FULL_PATH)
==> 1640012000.0
書式設定して出力する場合の例。 gmtime()でStructTime、もしくはlocaltime() でローカル時間に変換してから、strftime()で書式指定する。
import time
time.strftime('%Y-%m-%d(%a)_%H:%M:%S%z', time.localtime(os.path.getmtime(FULL_PATH)))
==> '2021-12-20(Mon)_20:20:00+0900'
time.strftime('%c', time.localtime(os.path.getmtime(FULL_PATH)))
==> 'Mon Dec 20 20:20:00 2021'
ファイルのサイズ(os.path.getsize)
byte単位でのファイルサイズ取得
os.path.getsize(FULL_PATH)
ファイル/ディレクトリの存在チェック(os.path.exists)
指定したファイルが存在すればTrue。しなければFalse。 指定内容は、ファイルでもディレクトリでも可
** Return True **
os.path.exists(FULL_PATH)
os.path.exists(DIR_PATH)
** Return False **
os.path.exists(TEST_DUMMY_PATH)
ファイルの存在チェック(os.path.isfile)
ファイルならTrue。 シンボリックリンクの場合は、辿った先がファイルかどうか。
** Return True **
os.path.isfile(FULL_PATH)
** Return False **
os.path.isfile(DIR_PATH)
os.path.isfile(TEST_DUMMY_PATH)
ディレクトリの存在チェック(os.path.isdir)
ディレクトリならTrue。 シンボリックリンクの場合は辿った先がディレクトリかどうか。
** Return True **
os.path.isdir(DIR_PATH)
** Return False **
os.path.isdir(FULL_PATH)
os.path.isdir(TEST_DUMMY_PATH)
ファイルコピー(メタデータを含まない)
shutil.copyfile(FILE_PATH, 'test1\\test.txt')
==> 'test1\\test.txt'
※下記のような記述すると、test.txtをtest1という名前で上書きしようとする動作になる。
ディレクトリ指定したい場合は、copy()を使用する。
NG例) shutil.copyfile('test.txt', 'test1')
ファイルコピー(メタデータを含む)
パーミッションのみで、作成時間や更新時間のメタデータを含まない(os.chmod())
shutil.copy(FILE_PATH, 'test1')
==> 'test1\\test1.txt'
※コピーされたファイルの更新日時は、コマンド実行時点の日時
可能な限りのメタデータを含めてコピー(copystat())
shutil.copy2(FILE_PATH, 'test1')
==> 'test1\\test1.txt'
※コピーされたファイルの更新日時は、元ファイルの更新日時と同じ
ファイル移動
shutil.move(FILE_PATH, './test1/test2.txt')
==> './test1/test2.txt'
ファイル削除
os.remove('./test1/test1.txt')
os.remove('./test1/test2.txt')
==>
※戻り値無し
ディレクトリ削除
os.rmdir('./test1')
==>
※戻り値無し
※ディレクトリ内は空である事。
ファイル等が存在していると「OSError: [WinError 145] ディレクトリが空ではありません。: './test1'」のエラーになる。