Python Coding Reference — 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'」のエラーになる。

Posted by tfurukaw