Pythonにできることは自動化しよう!【第6回 ファイル管理】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Pythonによるファイル管理で使用する一般的なモジュール・関数

Pythonにできることは自動化しよう!【第5回 ファイル操作・読み書き】では、Pythonによるファイルの操作や読み書きの基礎について学習しました。

今回はさらに一歩進んで、自身のPC上のファイル管理にPythonを活用します。大量のファイル名の修正や特定の形式のファイルのみのコピーや移動が必要な場合、これを手作業でやるのはかなり面倒です。こうした大量のデータに対する単純作業などは、Pythonのようなプログラムを使って処理できるようになると、非常にラクになります。面倒な作業を自動で行うことは、人為的なミスの削減にも繋がるというメリットもあります。

ファイル管理に必要なshutilモジュール

Pythonプログラムによるファイルのコピーや移動、名前の変更、削除等の作業には、shutilモジュールに含まれる関数を使用します。忘れずにインポートしておきましょう。osモジュールもインポートしておきます。

import shutil
import os

ファイル・フォルダのコピー shutil.copy()、shutil.copytree()関数

ファイルやフォルダのコピーには、shutil.copy()関数、shutil.copytree()関数を使用します。

  • shutil.copy(src,dst)関数:ファイルのコピー
    • 引数:
      • src: コピーしたいファイル(文字列)
      • dst: コピー先のフォルダあるいは新しいファイル名(文字列)
    • 返り値:
      • コピー先のファイルパス(文字列)
  • shutil.copytree(src,dst): フォルダ全体のコピー
    • 引数
      • src: コピーしたいフォルダ(文字列)
      • dst: コピー先のフォルダ(文字列)
    • 返り値:
      • コピー先のフォルダのパス(文字列)
os.chdir('/Users/username/oldfolder')
shutil.copy('/Users/username/oldfolder/oldfile.txt', '/Users/username/newfolder/') #1
# '/Users/username/newfolder/oldfile.txt'
shutil.copy('/Users/username/oldfolder/oldfile.txt', '/Users/username/newfolder/newfile.txt') #2
# '/Users/username/newfolder/newfile.txt'

1では、/Users/username/oldfolderに存在していたoldfile.txtを、/Users/username/newfolderにコピーしています。

2では、/Users/username/oldfolderに存在していたoldfile.txtを、/Users/username/newfolderにコピーした上で、ファイル名をnewfile.txtとしています。

os.chdir('/Users/username/oldfolder')
shutil.copy('/Users/username/oldfolder', '/Users/username/newfolder2')
# '/Users/username/newfolder/'

この例では、/Users/username/oldfolderと同じ中身を、/Users/username/newfolder2という新しいフォルダにコピーしています。

ファイル・フォルダの移動・名前変更 shutil.move()関数

ファイルやフォルダの移動、名前の変更にはshutil.move()関数を使用します。

  • shutil.move(src,dst)関数:ファイル・フォルダの移動あるいは名前の変更
    • 引数:
      • src: 移動したいファイルあるいはフォルダ(文字列)
      • dst: 移動先のパス。ファイル名を指定すると、指定した名前に変更されます。(文字列)
    • 返り値:
      • 移動先の絶対パス(文字列)

最初の例では、movetext.txtmfolder下に移動します。二番目の例では、movetext.txtmfolder下に移動し、ファイル名をmovedtext.txtに変更しています。

shutil.move('/Users/username/movetext.txt','/Users/username/mfolder')
# '/Users/username/mfolder/movetext.txt'

shutil.move('/Users/username/movetext.txt','/Users/username/mfolder/movedtext.text')

mfolder下にmovetext.txtという名のファイルが既に存在していた場合、move()関数によって上書きされてしまうので注意しましょう。



ファイル・フォルダの削除 shutil.unlink()、shutil.rmdir()、shutil.rmtree()関数

shutil.unlink()、shutil.rmdir()、shutil.rmtree()関数は、どれもファイルやフォルダの削除を行う関数です。
以下にそれぞれの機能をまとめておきます。

shutil.unlink()引数に指定したファイルを削除
shutil.rmdir()引数に指定した空のフォルダを削除
shutil.rmtree()引数に指定したフォルダとその中身を削除

ファイル・フォルダを安全に削除するにはsend2trashモジュールを使用する

エクスプローラやFinder等のGUIでファイルを削除する際、いきなり完全に削除するのではなく、一度ごみ箱に移動されるかと思います。

Pythonにおいても、send2trashモジュールを使用すれば、いきなり完全削除ではなく、ゴミ箱に移動してくれます。安全に削除したい場合は、shutil.rmtree()関数などよりもsend2trash.send2trash()関数を選択するように使い分けると良いでしょう。

標準ライブラリに含まれていないため、pip等でインストールしてから使用します。

%pip install send2trash
send2trash.send2trash('sakujoshitakunai.txt')

フォルダのツリー構造を把握するos.walk()関数

Pythonでは、os.walk()関数を使って、フォルダのツリー構造を渡り歩くようにして全てのファイルを操作することも可能です。
os.walk()関数は対象のフォルダ内を渡り歩くためのジェネレータとなっていて、forループの繰り返しによって3つの値を返します。

  • os.walk(dir)関数
    • 引数:
      • dir: 探索したいフォルダのパス(文字列)
    • 返り値:
      • 現在のループのフォルダ名(文字列)
      • 現在のループのフォルダの中のサブフォルダ名を表す文字列のリスト
      • 現在のループのフォルダの中のファイル名を表す文字列のリスト

例として、現在のフォルダを表す'.'os.walk()関数の引数として与えてみます。以下の例における現在のフォルダの中身がどのようになっているか、printされた文字列から推測できるかと思います。

for foldername, subfolders, filenames in os.walk('.'):
    print('Current folder: ' + foldername)
    
    for subfolder in subfolders:
        print(foldername + "'s sub folder: " + subfolder)
        
    for filename in filenames:
        print(foldername + "'s file: " + filename)
        
    print(' ')

# Current folder: .
# .'s sub folder: walktestsub
# .'s sub folder: walktestsub2
# .'s file: walktesttext.txt
 
# Current folder: ./walktestsub
# ./walktestsub's file: walktestsubtext.txt
 
# Current folder: ./walktestsub2
# ./walktestsub2's sub folder: walktestsubsub
 
# Current folder: ./walktestsub2/walktestsubsub
# ./walktestsub2/walktestsubsub's file: walktestsubsubtext.txt



参考書の自動化例

本シリーズで参考にしている「退屈なことはPythonにやらせよう」では、次のような応用例にファイル操作・読み書きを利用して、簡単な自動化プログラムを作成しています。今回の学習内容を使うと、以前学習した正規表現と組み合わせた応用も可能です。詳しい内容についてはぜひ書籍を参照してみてください。

  • 米国式日付を欧州式日付に変換
  • 大量のファイル名の一括修正
  • ハードディスク内で容量を専有しているデータの検索

まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第6回として、Pythonにおけるファイル管理について学習しました。Pythonにできることは自動化しよう!【第5回 ファイル操作・読み書き】で学習した内容と合わせて、自動化作業に必要な道具として使いこなせるようにしておきましょう。

追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。