- 公開日: 2018年07月23日
Pythonでローカルファイルの削除や読み書きを行えるようになろう!
Pythonプログラムを学習する理由の一つに「自動化」がありますね。
例えば「特定のファイル形式だけを抽出」「50MB以上のファイルだけを削除」など。
OS上で右クリックしていたらいくら時間があっても足りないようなことをPythonなら1秒以下で処理できちゃいます。
今回はそんな自動化を考える上で欠かせない、Pythonを使ったOSの操作方法を確認していきますね。
Pythonでローカルファイルの削除や読み書きを行えるようになろう!
Pythonを使ったローカル環境のファイル操作について
Pythonで OS 上のファイルやフォルダを操作できる代表的なモジュールは以下の4つ。
- os.
- os.path.
- pathlib()
- shutil()
os.
は OS に関する機能で、例えばパーミッションを変更する os.chmod()
など。
os.path.
は PATH に関係する機能で、例えばファイルの有無をチェックしたり、ファイルサイズを確認したり。
pathlib()
は、オブジェクト指向で使えるパス機能。
そして最後の shutil()
は、ファイル操作に関する機能。
今回は、 os.path.
をメインに実務的な例を交えていくつかの機能をご紹介していきます。
ファイルの有無をチェック
os.path.
の機能は31ありますが、その中でも基本的な機能の一つにファイルの有無をチェックする exists()
があります。(exists=存在)
例えば、test.csv ファイルあるかな?とファイルの有無を確認したいときは、以下のように。
import os
def FileExists(file_path_and_name):
return os.path.exists(file_path_and_name)
if FileExists('./test.csv'):
print('ファイルあるよ')
else:
print('ファイルないよ')
<< 結果 >>
4行目で os.path.exists(・・・・
の部分で exists()
関数を使用。
ファイルタイプを確認
こちらは実際のプロジェクトで使う機会は少ないのですが、 os.path.
の基本操作になりますのでご紹介。ファイルタイプを確認する方法は、主に以下の2つ。
- isfile()
- isdir()
isfile()
はファイルかどうかをチェック、 isdir()
はフォルダかどうかをチェック。
import os
def FileExists(file_path_and_name):
return os.path.isfile(file_path_and_name)
if FileExists('./test.csv'):
print('ファイルだよ')
else:
print('ファイルじゃないよ')
<< 結果 >>
isfile()
、 isdir()
以外にも islink()
や isabs()
などのチェック機能があります。
ファイルサイズを確認
パソコンの整理をする時にフォルダ内のファイルサイズ気になる時ありますよね。そんな時は以下のコードを実行するだけで、ファイルサイズを一括取得できます。
import os
directory = "/media/oshimamasara/Data256GB3/Programming/python/Pythonファイルチェック"
list = os.listdir(directory)
pairs = []
for file in list:
location = os.path.join(directory, file)
size = os.path.getsize(location)
pairs.append((size, file))
pairs.sort(key=lambda s: s[0])
for pair in pairs:
print(pair)
<< 結果 >>
3行目でファイル検索するフォルダを指定。そして os.path.join
でファイルの読み込み。これを応用すると、ある一定以上の大きさのファイルは自動削除する、というプログラムも作成できますね。
ある一定以上のファイルを自動的に削除
例えばハードディスクの空き容量の関係から 10MB 以上のファイルを一括削除したいと考えます。 もしPythonがなければ、ファイルを右クリックしてファイルサイズを確認し、削除するでしょう。 Pythonがあれば 0.1秒ほどで 10MB 以上のファイルを一括削除してくれます。
import os
def del_unneeded(folder):
for dirpath, dirnames, filenames in os.walk(folder):
for filename in filenames:
full_path = os.path.join(dirpath, filename)
if os.path.getsize(full_path) > 10000000:
print('削除してます {}...'.format(full_path))
os.remove(full_path)
del_unneeded('/media/oshimamasara/Data256GB3/Programming/python/')
print("完了")
<< 結果 >>
Pythonプログラムを保存するフォルダ内を対象にしたところ、意外と10MB以上のファイルがあったことにビックリ。
コード的には、下から2行目で削除対象のフォルダを指定。あとは os.path.join
でファイルを自動検索するようにして、 os.path.getsize
でファイルサイズを取得。最後に os.remove
で 10MB より大きいファイルを削除、という流れになっています。
特定ファイルの抽出
なんだかの理由で、「パソコン内のpdfファイルを集めないといけない」「Pythonファイルだけ抽出したい」という時。一つ一つのフォルダを開けて、ファイルの有無を確認されますでしょうか?
Pythonプログラムを使うとその作業、0.1秒以下で終わります。
import os
import shutil
def walk_copy(folder, ext, dst):
os.makedirs(dst, exist_ok=True)
lower_ext = ext.lower()
for foldername, subfolders, filenames in os.walk(folder):
for filename in filenames:
if filename.lower().endswith(lower_ext):
print('Copying', os.path.join(foldername, filename), '->', dst)
shutil.copy(os.path.join(foldername, filename), dst)
if __name__ == "__main__":
walk_copy('/media/oshimamasara/Data256GB3/', '.py', 'Python_Code')
<< 結果 >>
最終行の .py
を .pdf
や .jpg
などに変えてみると自分の欲しいデータを一瞬で手に入れることができると思います。
ファイルのコピーについては shutil
関数、フォルダの作成については os.makedirs
、ファイルチェックには os.path.join
が使用。
\AIエンジニアに必要なスキルが身に付く/
まとめ
今回ご紹介したファイル処理は直ぐに必要ないかもしれませんが、OSにはない特殊な機能になりますので知っておいて損はないでしょう。特にGitHubからプロジェクトをよくコピーされる方は、一括削除を知っておくと随分ハードディスクに余裕を持たせることができると思います(.git下の .pack はサイズ大です)。
Pythonを使ったファイル操作、便利そうだが「Pythonの実行方法が分からない」「ディレクトリやフォルダ、ってナニ?」という方、一度 CodeCamp でPythonの基礎学んでみませんか? オンライン × マンツーマンで勉強がはかどると思いますよ。
- この記事を書いた人
- オシママサラ