Pythonでファイルを作成する方法と削除する方法について解説します。新しくファイルを作成する方法は次の2つを紹介します。
- 組み込みのopen()関数を使う
- pathlibモジュールのtouch()メソッドを使う
一方、ファイルを削除する方法は次の2つを紹介します。
- osモジュールのremove()関数を使う
- pathlibモジュールのunlink()メソッドを使う
なお、この記事ではpathlibモジュールの詳しい使い方は省略します。pathlibモジュールを使ったことがない方は、次の記事で詳しく解説していますので併せて参照ください。
新規ファイルを作成する方法
新しくファイルを作成するには、組み込みのopen()関数を使う方法とpathlibモジュールで定義されている具象パスクラスのopen()メソッドあるいはtouch()メソッドを使う方法があります。
組み込みのopen()関数で作成する
組み込みのopen()関数を使い新規ファイルを作成するには、ファイルを書き込みモードでオープンします。オープンするモードは「w」「x」「a」のいずれでも構いません。これらの書き込みモードは、オープンしたファイルが存在しない場合、いずれも新規にファイルを作成します。
>>> with open('file1', 'w') as f:
... pass
...
>>> with open('file2', 'x') as f:
... pass
...
>>> with open('file3', 'a') as f:
... pass
...
>>> import os
>>> os.path.isfile('file1')
True
>>> os.path.isfile('file2')
True
>>> os.path.isfile('file3')
True
open()関数はファイルオブジェクトを返すので、ファイルを作成した後、ファイルオブジェクトのメソッドを使ってすぐにファイルへ書き込みができます。
ここではファイルを作成するだけで書き込みは行いませんが、with文の本体には1つ以上の文が必要なので、何も実行しないpass文を記述しています。
組み込みのopen()関数については次の記事で詳しく解説していますので、引数などについてはそちらをご参照ください。
pathlibモジュールのopen()メソッドで作成する
pathlibモジュールで定義されている具象パスクラスのopen()メソッドを使っても同様にファイルを作成することもできます。
>>> from pathlib import Path
>>> with p4.open('w') as f:
... pass
...
>>> with p5.open('x') as f:
... pass
...
>>> with p6.open('a') as f:
... pass
...
>>> p4.is_file()
True
>>> p5.is_file()
True
>>> p6.is_file()
True
オープンするモード(「w」「x」「a」)の意味は組み込みのopen()関数との同じです。open()メソッドもファイルオブジェクトを返すので、すぐにファイルへ書き込みができます。
pathlibモジュールのtouch()メソッドで作成する
pathlibモジュールで定義されている具象パスクラスのtouch()メソッド使ってファイルを作成することもできます。
>>> from pathlib import Path
>>> p = Path('file4')
>>> p.touch()
>>> p.is_file()
True
2行目で具象パスクラスのインスタンスを作成し、3行目でそのインスタンスのtouch()メソッドを呼び出しています。
touch()メソッドはファイルが既に存在していた場合、ファイルのタイムスタンプのみを更新します。ファイルの内容を変更することはありません。
exist_ok引数にFalse(デフォルトはTrue)を指定すると、ファイルが存在した場合にFileExistsErrorを送出します。
>>> p = Path('file4')
>>> p.touch(exist_ok=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.9/pathlib.py", line 1315, in touch
fd = self._raw_open(flags, mode)
File "/usr/lib64/python3.9/pathlib.py", line 1127, in _raw_open
return self._accessor.open(self, flags, mode)
FileExistsError: [Errno 17] File exists: 'file4'
touch()メソッドでは、アクセス権(モード)を指定することもできます。
>>> p.touch(mode=0o777)
>>> import stat
>>> stat.filemode(p.stat().st_mode)
'-rw-r--r--'
アクセス権はプロセスのumask値と組み合わせて決定されます。この例ではumask値は「0022」なので、マスクされた結果アクセス権は「0o644」になります。
ファイルを削除する方法
osモジュールのremove()関数でファイルを削除する
os.remove()関数は引数に指定されたパスのファイルを削除します。
>>> os.remove('file1')
>>> os.path.exists('file1')
False
pathlibモジュールのunlink()メソッドでファイルを削除する
pathlibモジュールで定義されている具象パスクラスのunlink()メソッド使ってファイルを削除することもできます。
>>> p = Path('file4')
>>> p.unlink()
>>> p.exists()
False
まとめ
新規ファイルを作成する場合、組み込みのopen()関数や具象パスクラスのopen()メソッドを使うと、すぐにファイルに書き込みができます。一方、具象パスクラスのtouch()メソッドは、ファイルのアクセス権(モード)を指定できるメリットがあります。
ファイルを削除する場合は、コードでパスを具象パスオブジェクトとして扱っている場合は、具象パスオブジェクトのunlink()メソッドを使った方がコードに一貫性があり理解しやすくなるでしょう。
どちらの方法も一長一短があるので、これらの2つの方法は用途やコードの前後関係などを考慮して使い分けるといいと思います。