Pythonでファイル操作を行うTips集

~Make it less boring vol.1~

先日、雑務タスクとしてファイル操作を依頼された。基本的にgit bashを使っての操作がメインだったけども、普段使っているpythonでも同じことができるだろうと思い、作業を進めた。基本的な操作のみだったけども、利用頻度も少なくすぐに忘れそうだったのでここに備忘録として残しておく。

Tips集

利用したモジュール

本記事では、pythonの一般的なモジュールである、osshutilから利用した関数をまとめる。

docs.python.org

docs.python.org

import os     # 雑多なオペレーティングシステムインターフェース
import shutil # 高水準のファイル操作
import gzip   # ファイルを圧縮処理する際に活用した

ディレクトリの確認や変更

os.getcwd()             # 現在のワーキングディレクトリを返す
os.chdir('path_name')   # path_name のディレクトリに移動する
os.mkdir('dir_name')    # dir_name という名前のディレクトリを作成する

ファイルの指定、サイズ確認、削除方法

os.path.join('folder', 'file1')  # 一つあるいは、複数個のパスの結合を自動に行う関数。
>> 'folder/file1'

os.path.getsize('folder/file1') # 指定されたpathのファイルサイズを求める方法です。単位はbytesです。
>> 0

os.remove('folder/file1')    #指定したファイルを削除する

ディレクトリ内のフォルダやファイルを確認する

os.walk('path')

基本的にこの関数を使用する。このos.walk()関数はディレクトリーツリー以下のファイル名を一つずつ検証する形式になっている。アウトプットとして、dirpath, dirnames, filenamesを返すのでこれを考慮した上でコードを書けば問題ない。

file_list = [] # ファイル名リスト
for dirpath, dirnames, filenames in os.walk('dir_name'):
    for file in filenames:
         path = os.path.join(dirpath, file) # ディレクトリとファイル名を結合
         file_list.append(path)             # 空のリストに要素を追加

ファイルを移動させる

shutil.copy(before_path, destination_path)

shutil.copy()関数を用いることで、第一引数から、第二引数へと、ファイルをそのままコピーすることが可能である。

ファイルを圧縮する

ファイルを一つずつ圧縮するケースよりも、複数のファイルをまとめて圧縮処理しなければいけないケースの方が多いと思われる。自分も今回のタスクでは後者に当て嵌まったので、今回のサンプルコードでは、file_listというリストに入っているファイル全てに対して圧縮処理をするコードを記述しておく。

for file in file_list:
     with open(file, 'rb') as f_in:
      with gzip.open(str(file)+'.gz', 'wb') as f_out: # 出力するファイルに.gz拡張子を埋め込む
        shutil.copyfileobj(fin, fout)

ファイルを.gzという拡張子をつけた上で圧縮作業をするワークフローだったので、拡張子を入れることを考慮した処理になっている。また、圧縮したファイルを違うフォルダに写したいというときは、gzip.open()の第一引数で違うフォルダのパスを指定すれば良い。

まとめ

このような細かい作業は、すぐ忘れてしまうので、後々振り返りをするために備忘録として記録した。今後とも、退屈な作業を簡単にするためのテクニックを記録していきたい。