Python – 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: ディレクトリが空ではありません。: './test1'」のエラーになる。
最近のコメント