【Python入門】ファイルに関連する操作

 ここでは、Python を用いてファイルに関連するさまざまな操作を行う方法について解説します。具体的には、ディレクトリ内のファイル一覧の取得、各ファイルの内容(例:行数)の集計、そしてファイルのコピー、名前の変更、削除やコマンドライン引数の取得など、ファイル操作に役立つ基本テクニックを学びます。ここでは、主に標準ライブラリの glob、os、shutil、sys モジュールを利用した手法を紹介します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.ファイル一覧の取得と内容の集計

1.1. glob モジュールの概要と利用方法

 glob モジュールは、指定したパターンにマッチするファイル名の一覧を取得するための標準ライブラリです。パスにワイルドカード(例: *)を含めることで、特定の拡張子を持つファイルや名前のパターンに一致するファイルを簡単に列挙できます。
以下の表は、glob.glob 関数の主なパラメータを示しています。

パラメータ意味
パス検索対象のパス。ワイルドカード(* など)を含めることができる。
recursive再帰的にサブディレクトリ内も検索する場合は True を指定(デフォルトは False)。

1.2. 実例:ディレクトリ内のファイル一覧と行数の集計

 以下のプログラム例では、カレントディレクトリ内にある "datafile" で始まる任意の拡張子のファイルを列挙し、各ファイルの行数を計算して表示します。各ファイルの内容は、UTF-8 エンコーディングで読み込み、改行コード \n の個数から行数を求めています。
プログラムは次の通りです。

import glob

# 合計行数を初期化
total_lines = 0

# 'datafile.*' パターンでファイルを検索(サブディレクトリも含む場合は recursive=True)
for filename in glob.glob('datafile.*', recursive=True):
    with open(filename, encoding='utf-8') as f:
        content = f.read()
        # ファイルが空でない場合、改行数に1を加えた値を行数とする
        line_count = content.count('\n') + (1 if content else 0)
    # ファイル名は20桁、行数は右寄せで5桁のフォーマットで表示
    print(f'{filename:<20}{line_count:>5}')
    total_lines += line_count

print('-' * 30)
print(f'{"Total":<20}{total_lines:>5}')

実行結果

datafile.text          10
datafile.txt            5
------------------------------
Total                  15

 このコードでは、glob.glob 関数により指定したパターンに一致するファイル名のリストを取得し、for 文で各ファイルを順次処理しています。open 関数の encoding オプションで 'utf-8' を指定し、ファイル内容を文字列として読み込んだ後、count メソッドで改行文字の個数を求めています。f文字列を用いてファイル名と行数を整形表示することで、結果を見やすく出力しています。

2.その他のファイル操作とコマンドライン引数の取得

2.1. ファイルのコピー、名前の変更、削除

 ファイルのコピーや名前の変更、削除といった操作は、os モジュールや shutil モジュールを利用して実行できます。たとえば、shutil.copy 関数を使えばファイルのコピーが簡単に行え、os.rename 関数で名前の変更、os.remove 関数でファイルの削除が可能です。以下は各操作の概要を示す表です。

操作使用する関数説明
コピーshutil.copy(src, dst)src から dst へファイルをコピー
名前の変更os.rename(old, new)old という名前のファイルを new に変更
削除os.remove(path)指定したパスのファイルを削除

2.2. コマンドライン引数の取得

 プログラム実行時にコマンドライン引数を取得するには、sys モジュールの argv リストを利用します。argv には、プログラム名のほか、実行時に渡された引数が文字列として格納されます。以下は簡単な例です。

command_line.py

import sys

# コマンドライン引数の一覧を表示(argv[0] はプログラム名)
print("引数一覧:", sys.argv)

 JupyterLab ではプログラム名が「ipykernel_launcher.py」と表示されますが、CPythonで実行するとプログラム名が表示されます。スクリプトとして実行する際には非常に有用な機能です。ダウンロードファイルには「command_line.py」が含めています。

まとめ

 ここでは、ファイルに関連する操作の基本として、glob モジュールを用いたファイル一覧の取得とその内容(例:行数)の集計方法、さらにファイルのコピー、名前の変更、削除といった操作、加えてコマンドライン引数の取得方法について解説しました。各機能は、ファイル操作を自動化・効率化するための重要なテクニックであり、JupyterLab でも容易に実行可能です。これらの基本操作を習得することで、複数のファイルを対象とした処理やバッチ処理、さらにはシステム管理やデータ前処理など、幅広い用途に応用できるようになります。