Python自動化の基礎として、引数を受け取って処理する考え方を身につける
Python自動化を学び始めたばかりの方にとって、最初の壁になりやすいのが「毎回コードを書き換えなくても、実行時に条件を変えて処理したい」という場面です。このときに重要になるのが、引数を受け取って処理する考え方です。
自動化では、毎回まったく同じ処理だけを行うとは限りません。ある日はこのフォルダを処理したい、別の日は別のCSVファイルを集計したい、あるいは今日だけ件数の上限を変えたい、といったことが起こります。こうしたとき、コードの中身を毎回編集していると、手間がかかるだけでなく、書き換えミスも起こりやすくなります。
そこで役立つのが引数です。引数を使うと、プログラムを実行するときに外から値を渡し、その値に応じて処理を変えられます。これは自動化において非常に重要です。なぜなら、自動化の価値は「同じ仕組みを、違う対象に何度も安全に使い回せること」にあるからです。
この記事では、Python自動化の基礎として、引数とは何か、なぜ必要なのか、どのように受け取り、どう安全に使うのかを、初心者向けに順番にわかりやすく解説します。単なる文法説明ではなく、実際の自動化につながる形で、例題やテンプレートも交えて説明します。
まず理解したい、引数とは何か
引数は、プログラムの外から渡す情報です
引数とは、プログラムを実行するときに一緒に渡す追加情報のことです。たとえば「このファイルを処理してほしい」「この回数だけ繰り返してほしい」「この文字列を使ってほしい」といった内容を、実行時に指定できます。
初心者の方は、最初はコードの中に直接値を書き込むことが多いです。たとえば、対象ファイル名をコード内に固定で書く方法です。もちろん学習の初期段階ではそれでも構いません。しかし、自動化を実用的にしていくには、外から値を渡せるようにしたほうが便利で安全です。
たとえば、次の2つを比べると違いがわかりやすいです。
- コードの中に
"sales.csv"と直接書く方法 - 実行時に
sales.csvを引数として渡す方法
前者は簡単ですが、別のCSVを処理したくなったらコードを修正する必要があります。後者なら、同じコードをそのまま使って、渡すファイル名だけ変えれば済みます。これが引数の大きな利点です。
引数が必要になる場面
Python自動化では、引数が活躍する場面が非常に多いです。たとえば次のようなケースです。
- 処理対象のファイル名を指定したいとき
- 対象フォルダを実行時に選びたいとき
- 検索したいキーワードを渡したいとき
- 集計件数や上限値を変えたいとき
- 確認モードと本番モードを切り替えたいとき
このように、引数は「プログラムの動き方を、実行時に少し調整する仕組み」と考えると理解しやすいです。
なぜ引数が自動化で重要なのか
同じコードを使い回せるようになる
自動化で大切なのは、毎回1回きりのコードを書くことではなく、何度も再利用できる形にすることです。そのためには、コードの本体と、実行時に変わる値を分けて考える必要があります。
たとえば、CSVを集計するプログラムがあるとして、毎回ファイル名を書き換えるのではなく、引数でファイル名を渡せるようにすれば、同じプログラムで複数のCSVを扱えます。これは効率の面でも、保守の面でもとても有利です。
書き換えミスを減らせる
初心者の方がよくやってしまうのは、対象ファイル名やフォルダ名をコード内で何か所も書き換えてしまい、修正漏れを起こすことです。自動化のコードは一度作ると何度も使うため、毎回中身を編集する運用は危険です。
引数を使えば、プログラム本体には手を入れず、実行時の入力だけを変えられます。これにより、コードの破壊的な編集が減り、意図しないバグも起こりにくくなります。
将来の拡張に強くなる
最初は単純なスクリプトでも、あとから機能を増やしたくなることはよくあります。たとえば、最初は1つのファイルを処理するだけだったものが、確認モード、本番モード、出力先変更、件数制限などを追加したくなることがあります。
最初から引数を受け取る設計にしておくと、こうした拡張がしやすくなります。つまり、引数は便利な機能というだけでなく、成長しやすいコードの土台でもあります。
Pythonで引数を受け取る基本
sys.argv を使って受け取る
Pythonでコマンドライン引数を受け取る最も基本的な方法は、sys モジュールの argv を使うことです。argv には、実行時に渡された文字列が順番に入っています。
まずは最小のサンプルを見てみます。
import sys
# 渡された引数の一覧をそのまま表示するサンプルです
print(sys.argv)Pythonこのコードを args_sample.py として保存し、コマンドラインで次のように実行します。
python args_sample.py hello world
すると、sys.argv の中に実行時の情報が入っていることが確認できます。ここで重要なのは、最初の要素にはスクリプト自身の名前が入ることです。つまり、sys.argv[0] はファイル名、sys.argv[1] 以降が実際に渡した引数です。
この仕様は初心者の方が最初に混乱しやすい点です。引数は0番目から始まるのではなく、1番目から使うことが多いと覚えておくと整理しやすいです。
1つの引数を受け取る最初の例
次に、1つの引数を受け取ってメッセージを表示する簡単な例を見てみます。
import sys
# メイン処理です
def main():
# 引数が足りない場合は使い方を表示します
if len(sys.argv) < 2:
print("使い方: python greet.py 名前")
return
# 1つ目の引数を名前として受け取ります
name = sys.argv[1]
# 引数を使ってメッセージを表示します
print(f"こんにちは、{name} さん")
# このファイルが直接実行されたときだけmain関数を実行します
if __name__ == "__main__":
main()Pythonこれを greet.py として保存し、たとえば次のように実行します。
python greet.py Taro
すると、渡した名前が表示されます。これは単純な例ですが、「実行時に外から値を受け取って使う」という引数の基本がよく表れています。
自動化の考え方として、引数をどう使うか
固定値と可変値を分けて考える
引数をうまく使うコツは、「何をコード内に固定し、何を外から変えられるようにするか」を考えることです。初心者の方は、すべてをコードに直接書くか、逆に何でも引数にしようとして混乱しがちです。
判断の目安としては、毎回変わる可能性があるものは引数候補です。逆に、毎回ほぼ同じなら、最初はコード内に書いても構いません。
- 変わりやすいもの:ファイル名、フォルダパス、検索文字列、件数、モード
- 変わりにくいもの:基本的な処理の流れ、内部の計算ルール
この考え方ができると、自動化スクリプトの設計がかなりしやすくなります。
引数は入力の一種として扱う
自動化を考えるときは、引数もファイルやユーザー入力と同じく「入力」の一種です。つまり、受け取った値が本当に正しいとは限らないと考える必要があります。
たとえば、存在しないファイル名が渡されるかもしれませんし、数字のつもりが文字列かもしれません。安全な自動化を書くには、引数を受け取ったら、その値を確認することが重要です。これを怠ると、エラーや誤動作につながります。
例題1 引数で受け取ったファイル名を表示する
最初に作るべき最小の実用例
まずは、引数で受け取ったファイル名をそのまま表示する簡単な例を作ります。これは小さいですが、引数処理の土台になります。
import sys
# 引数で受け取ったファイル名を表示する関数です
def show_file_name():
# 引数が足りるか確認します
if len(sys.argv) < 2:
print("使い方: python show_file.py ファイル名")
return
# 1つ目の引数をファイル名として取得します
file_name = sys.argv[1]
# 受け取ったファイル名を表示します
print(f"受け取ったファイル名は {file_name} です")
if __name__ == "__main__":
show_file_name()Pythonこの段階では処理内容は単純ですが、実行時に値を受け取る流れを体感できます。初心者の方は、まずこのくらい小さい成功を作ってから次に進むと理解しやすいです。
例題2 引数で受け取ったフォルダの中身を表示する
自動化らしい処理へ少し進める
次に、引数で受け取ったフォルダの中身を表示する例を見てみます。これは「引数を受け取る」と「ファイル操作」を組み合わせた、自動化の入門として非常に良い題材です。
import os
import sys
# 指定したフォルダの中身を表示する関数です
def show_folder_items(folder_path):
# フォルダが存在しない場合はメッセージを表示して終了します
if not os.path.exists(folder_path):
print("指定したフォルダが見つかりません")
return
# フォルダでない場合はメッセージを表示して終了します
if not os.path.isdir(folder_path):
print("指定したパスはフォルダではありません")
return
# フォルダ内の一覧を取得します
items = os.listdir(folder_path)
# 中身を1つずつ表示します
for item in items:
print(item)
# メイン処理です
def main():
# 引数が足りない場合は使い方を表示します
if len(sys.argv) < 2:
print("使い方: python show_folder.py フォルダパス")
return
# 引数からフォルダパスを取得します
folder_path = sys.argv[1]
# 指定されたフォルダの中身を表示します
show_folder_items(folder_path)
if __name__ == "__main__":
main()Pythonこのコードの大切な点は、いきなり一覧取得をせず、先に存在確認とフォルダ判定をしていることです。初心者の方は、動かすことを急いで確認処理を省きがちですが、実際の自動化ではこの確認が非常に重要です。
とくにファイルやフォルダを扱う処理は、間違った対象に対して実行すると問題が大きくなりやすいです。最初から確認を入れる習慣をつけることで、安全なコードを書く土台ができます。
例題3 引数で受け取ったCSVを集計する
実務に近い自動化の入門例
次に、引数で受け取ったCSVファイルを読み込み、特定の列を合計する例を見てみます。これは自動化の実務感がかなり出てくる題材です。
import csv
import os
import sys
# CSVファイルのprice列を合計する関数です
def calculate_total(csv_file_path):
# 合計値を入れる変数です
total = 0
# CSVファイルを開きます
with open(csv_file_path, mode="r", encoding="utf-8") as file:
# 1行ずつ辞書形式で読み込みます
reader = csv.DictReader(file)
# 各行のpriceを合計します
for row in reader:
total += int(row["price"])
# 合計値を返します
return total
# メイン処理です
def main():
# 引数が足りない場合は使い方を表示します
if len(sys.argv) < 2:
print("使い方: python total_csv.py CSVファイル名")
return
# 引数からCSVファイル名を受け取ります
csv_file_path = sys.argv[1]
# ファイルが存在するか確認します
if not os.path.exists(csv_file_path):
print("指定したCSVファイルが見つかりません")
return
# 合計値を計算します
total = calculate_total(csv_file_path)
# 結果を表示します
print(f"合計金額は {total} 円です")
if __name__ == "__main__":
main()Pythonこのスクリプトは、同じ集計ロジックを保ったまま、処理対象のCSVだけを引数で切り替えられます。これが引数の本領です。コード本体は変えずに、扱う対象だけを差し替えられるため、自動化の再利用性が高まります。
この例題で特に注意したいこと
CSV処理では、受け取ったファイルが本当に期待どおりの形式かを確認する意識が重要です。たとえば、列名が違う、空欄がある、数値ではない文字が混じる、といった問題が起こります。引数で外からファイルを受け取るようになると、コード内に固定したデータよりも入力の揺れが増えるため、確認の重要性がさらに高まります。
つまり、引数を使う設計は便利になる一方で、「外から来る値を信じすぎない」という姿勢も同時に必要です。これは情報セキュリティの観点でも大切な考え方です。
少し安全にした版
import csv
import os
import sys
# CSVファイルのprice列を安全に合計する関数です
def calculate_total(csv_file_path):
# 合計値を初期化します
total = 0
# ファイルを開きます
with open(csv_file_path, mode="r", encoding="utf-8") as file:
# 辞書形式で読み込みます
reader = csv.DictReader(file)
# 1行ずつ処理します
for row in reader:
# price列を取得します
price_text = row.get("price", "").strip()
# 空欄ならスキップします
if price_text == "":
print("price列が空欄の行をスキップしました")
continue
# 数値に変換できるものだけ加算します
try:
total += int(price_text)
except ValueError:
print(f"数値に変換できない値をスキップしました: {price_text}")
# 合計値を返します
return total
def main():
# 引数が足りない場合は使い方を表示します
if len(sys.argv) < 2:
print("使い方: python total_csv.py CSVファイル名")
return
# 引数からCSVファイル名を取得します
csv_file_path = sys.argv[1]
# ファイルの存在確認をします
if not os.path.exists(csv_file_path):
print("指定したCSVファイルが見つかりません")
return
# 合計値を計算します
total = calculate_total(csv_file_path)
# 結果を表示します
print(f"安全に計算した合計金額は {total} 円です")
if __name__ == "__main__":
main()Pythonこのような形にすると、入力が多少乱れていても、途中で止まりにくくなります。初心者のうちから、正常な入力だけでなく、少し崩れた入力も想定して書く習慣を持つと、とても強いです。
複数の引数を受け取る考え方
引数が増えるときは、役割を整理する
自動化が少し進むと、1つだけでなく複数の引数を受け取りたくなります。たとえば「対象ファイル名」と「出力ファイル名」を両方受け取りたい場合です。このとき大切なのは、引数の順番と意味をはっきり決めることです。
import sys
# 2つの引数を受け取るサンプルです
def main():
# 引数が2つ必要か確認します
if len(sys.argv) < 3:
print("使い方: python sample.py 入力ファイル 出力ファイル")
return
# 1つ目を入力ファイル名として受け取ります
input_file = sys.argv[1]
# 2つ目を出力ファイル名として受け取ります
output_file = sys.argv[2]
# 受け取った内容を表示します
print(f"入力ファイル: {input_file}")
print(f"出力ファイル: {output_file}")
if __name__ == "__main__":
main()Python引数が増えるほど便利になりますが、そのぶん使い方がわかりにくくなります。そのため、使い方のメッセージを丁寧に出すことが大切です。初心者の方は自分だけが使うつもりで書きがちですが、将来の自分もまた別の利用者です。数日後に見ても迷わないようにしておくことが重要です。
引数を使うときのセキュリティと安全性
受け取った値をそのまま信用しない
引数は便利ですが、外から渡される入力である以上、必ずしも正しいとは限りません。これは単なるエラー対策だけでなく、セキュリティ上も重要です。たとえば、不正なパス、想定外の文字列、空文字、危険なファイル名などが渡される可能性があります。
初心者向けの段階でも、少なくとも次の確認は意識すると良いです。
- 引数の数が足りているか
- ファイルやフォルダが本当に存在するか
- 期待している種類の値かどうか
- 処理してよい対象かどうか
この考え方は、将来WebアプリやAPIを扱うときにもそのまま生きます。つまり、引数の検証は自動化だけの話ではなく、安全なプログラムを書くための基本です。
削除や上書き処理では特に慎重になる
もし引数で受け取ったファイルやフォルダに対して削除や上書きを行うなら、注意はさらに必要です。誤った引数が渡された場合に、重要なファイルへ影響が出るおそれがあるからです。
このような処理では、最初から本番実行するのではなく、確認モードを用意する方法が有効です。たとえば「削除する予定のファイル名だけ表示する」「実際には書き込まず処理内容だけ表示する」といった方法です。これは初心者だけでなく実務でも有効な安全策です。
初心者向けの実用テンプレート
ここまでの内容を踏まえると、引数を受け取る自動化スクリプトの基本テンプレートは次のようになります。
import os
import sys
# 対象を処理する関数です
def process_target(target_path):
# 対象が存在するか確認します
if not os.path.exists(target_path):
print("指定した対象が存在しません")
return
# ファイルかフォルダかで処理を分けます
if os.path.isfile(target_path):
print(f"ファイルを処理します: {target_path}")
elif os.path.isdir(target_path):
print(f"フォルダを処理します: {target_path}")
else:
print("ファイルでもフォルダでもない対象です")
# メイン処理です
def main():
# 引数が足りない場合は使い方を表示します
if len(sys.argv) < 2:
print("使い方: python template.py 対象パス")
return
# 1つ目の引数を対象として受け取ります
target_path = sys.argv[1]
# 開始メッセージを表示します
print("処理を開始します")
# 実際の処理を行います
process_target(target_path)
# 終了メッセージを表示します
print("処理を終了します")
# このファイルが直接実行されたときだけmain関数を呼び出します
if __name__ == "__main__":
main()Pythonこのテンプレートは非常に基本的ですが、実務でも通用する重要な流れが含まれています。引数確認、存在確認、処理の分岐、開始と終了の表示という構成は、多くの自動化スクリプトの土台になります。
学習を進めるときのおすすめの順番
引数を使ったPython自動化を身につけるには、次の順番で練習すると理解しやすいです。
- まずは
sys.argvの中身を表示する - 次に1つの引数を受け取って表示する
- その次に引数で受け取ったファイル名やフォルダ名を使う
- 存在確認や型の確認を加える
- CSV集計やファイル一覧表示などの実用例に進む
- 最後に複数引数や確認モード付きの設計へ広げる
この順番には理由があります。最初に仕組みそのものを理解し、そのあとで実用処理へつなげることで、文法と使い道が結びつきやすくなるからです。初心者の方は、難しい処理を一気に作るより、短い成功を積み上げるほうが確実です。
まとめ
Python自動化の基礎として、引数を受け取って処理する考え方は非常に重要です。引数を使えるようになると、コードの中身を毎回書き換えなくても、実行時に対象や条件を変えられるようになります。これにより、同じスクリプトを何度も再利用でき、自動化の価値が大きく高まります。
特に初心者の方は、引数を単なる文法として覚えるのではなく、「変わりやすい値を外から渡す仕組み」として理解すると、自動化全体の見通しが良くなります。ファイル名、フォルダパス、件数、モードなど、毎回変わる可能性があるものは引数に向いています。
一方で、引数は外部入力でもあるため、正しいと決めつけず、存在確認や形式確認を行うことが大切です。便利さと安全性はセットで考える必要があります。特に削除や上書きに関わる処理では、確認モードを入れるなど慎重な設計が重要です。
Python自動化を実用的にしていく第一歩として、引数を受け取るスクリプトはとても良い練習になります。まずは小さな例から始めて、少しずつ「受け取る」「確認する」「処理する」という流れに慣れていくことをおすすめします。これができるようになると、自動化の幅が一気に広がります。
