はじめに
この実験では、Python の基本的なファイル入出力操作を復習します。株式ポートフォリオ情報が記載されたファイルからデータを読み取り、ポートフォリオの総コストを計算する Python プログラムを作成します。
この実験の目的は、Python でファイルを開いて読み取る方法、ファイルからのデータを一行ずつ処理する方法、データに対して計算を行う方法、および結果を出力する方法を学ぶことです。作成するファイルは pcost.py です。
問題の理解
このステップでは、まず解決すべき問題が何であるかを理解し、次に扱うデータを見てみます。これは、何を目指しているのか、利用可能なリソースが何かを正確に把握するのに役立つため、あらゆるプログラミングタスクにおいて重要な最初のステップです。
プロジェクトディレクトリには、portfolio.dat という名前のファイルがあります。このファイルには、株式ポートフォリオの情報が格納されています。ポートフォリオとは、投資家が保有する様々な株式の集まりのことです。このファイルの各行は、1 回の株式購入を表しています。各行の形式は以下の通りです。
[株式シンボル] [株式数] [1株あたりの価格]
株式シンボルは、特定の会社の株式を表す短いコードです。株式数は、その株式を何単位購入したかを示し、1 株あたりの価格は、その株式の 1 単位のコストです。
例を見てみましょう。ファイルの最初の行を考えてみます。
AA 100 32.20
この行は、シンボルが "AA" の株式を 100 株購入したことを示しています。1 株あたりの価格は 32.20 ドルです。
portfolio.dat ファイルの中身を見たい場合は、ターミナルで以下のコマンドを実行できます。cat コマンドは、ファイルの内容を表示するのに便利なターミナルツールです。
cat ~/project/portfolio.dat
さて、あなたのタスクは、pcost.py という名前の Python プログラムを作成することです。このプログラムは、以下の 3 つの主要なタスクを実行します。
- まず、
portfolio.datファイルを開いて読み取る必要があります。Python でファイルを開くことで、プログラムがその中に格納されているデータにアクセスできるようになります。 - 次に、ポートフォリオ内のすべての株式購入の総コストを計算する必要があります。これを行うには、ファイルの各行について、株式数に 1 株あたりの価格を掛ける必要があります。各行についてこれらの値を取得した後、それらをすべて合計します。これにより、ポートフォリオ内のすべての株式に費やされた総金額が得られます。
- 最後に、プログラムは総コストを出力する必要があります。これにより、計算結果を確認できます。
それでは、pcost.py ファイルを作成して始めましょう。エディタを使用してこのファイルを開き、編集できます。このファイルは、セットアップステップですでに作成されています。このファイルは、先ほど説明した問題を解決する Python コードを記述する場所になります。
ファイルの開きと読み取り
このステップでは、Python でファイルを開いて読み取る方法を学びます。ファイル入出力 (I/O) は、プログラミングにおける基本的な概念です。これにより、プログラムがテキストファイルや CSV ファイルなどの外部ファイルとやり取りできるようになります。Python でファイルを扱う最も一般的な方法の 1 つは、open() 関数を使用することです。
open() 関数は、Python でファイルを開くために使用されます。この関数には 2 つの重要な引数が必要です。最初の引数は、開きたいファイルの名前です。2 番目の引数は、ファイルを開くモードです。ファイルを読み取りたい場合は、'r' モードを使用します。これは、Python に対してファイルの内容を読み取るだけで、ファイルに何らかの変更を加えないことを伝えます。
それでは、pcost.py ファイルにコードを追加して、portfolio.dat ファイルを開いて読み取りましょう。コードエディタで pcost.py ファイルを開き、以下のコードを追加します。
## pcost.py
## 株式ポートフォリオの総コストを計算する
def portfolio_cost(filename):
"""
ポートフォリオファイルの総コスト (株式数 * 価格) を計算する
"""
total_cost = 0.0
## ファイルを開く
with open(filename, 'r') as file:
## ファイル内のすべての行を読み取る
for line in file:
print(line) ## デバッグ用、読み取っている内容を確認するため
## 総コストを返す
return total_cost
## ポートフォリオファイルを引数にして関数を呼び出す
total_cost = portfolio_cost('portfolio.dat')
print(f'総コスト:${total_cost}')
このコードが何をするかを分解してみましょう。
- まず、
portfolio_cost()という名前の関数を定義します。この関数は、ファイル名を入力パラメータとして受け取ります。この関数の目的は、ファイル内のデータに基づいて株式ポートフォリオの総コストを計算することです。 - 関数の内部で、
open()関数を使用して指定されたファイルを読み取りモードで開きます。with文を使用することで、ファイルの読み取りが終了した後にファイルが適切に閉じられることを保証します。これは、リソースのリークを避けるための良い習慣です。 - 次に、
forループを使用してファイルを一行ずつ読み取ります。ファイルの各行について、その行を表示します。これはデバッグ目的で行っているだけで、ファイルから読み取っているデータを確認するためです。 - ファイルの読み取りが終了した後、関数は総コストを返します。現在、総コストは 0.0 に設定されています。これは、実際の計算をまだ実装していないためです。
- 関数の外で、
portfolio_cost()関数を 'portfolio.dat' というファイル名で呼び出します。これは、関数に対してportfolio.datファイル内のデータに基づいて総コストを計算するように要求しています。 - 最後に、f-string を使用して総コストを表示します。
それでは、このコードを実行して、何が起こるかを見てみましょう。ターミナルで以下のコマンドを使用して Python ファイルを実行できます。
python3 ~/project/pcost.py
このコマンドを実行すると、portfolio.dat ファイルの各行がターミナルに表示され、その後に現在 0.0 に設定されている総コストが表示されるはずです。この出力により、ファイルが正しく読み取られていることを確認できます。
データの処理
ファイルの読み取り方法を学んだので、次のステップは、ファイルの各行を処理して、各株式購入のコストを計算することです。これは、Python でデータを扱う上で重要な部分であり、ファイルから有意義な情報を抽出することができます。
ファイルの各行は特定の形式に従っています:[株式シンボル] [株式数] [1株あたりの価格]。各株式購入のコストを計算するには、各行から株式数と 1 株あたりの価格を抽出する必要があります。そして、これら 2 つの値を掛け合わせて、その特定の株式購入のコストを求めます。最後に、このコストを累計に加えて、ポートフォリオの総コストを求めます。
これを実現するために、pcost.py ファイルの portfolio_cost() 関数を修正しましょう。以下は修正後のコードです。
def portfolio_cost(filename):
"""
ポートフォリオファイルの総コスト (株式数*価格) を計算する
"""
total_cost = 0.0
## ファイルを開く
with open(filename, 'r') as file:
## ファイル内のすべての行を読み取る
for line in file:
## 先頭と末尾の空白を削除する
line = line.strip()
## 空行をスキップする
if not line:
continue
## 行をフィールドに分割する
fields = line.split()
## 関連するデータを抽出する
## fields[0] は株式シンボル (計算には必要ない)
shares = int(fields[1]) ## 株式数 (2 番目のフィールド)
price = float(fields[2]) ## 1 株あたりの価格 (3 番目のフィールド)
## この株式購入のコストを計算する
cost = shares * price
## 総コストに追加する
total_cost += cost
## デバッグ情報を表示する
print(f'{fields[0]}: {shares} 株、価格 ${price:.2f} = 合計 ${cost:.2f}')
## 総コストを返す
return total_cost
この修正後の関数がどのように動作するかをステップごとに分解してみましょう。
- 空白を削除する:
strip()メソッドを使用して、各行の先頭と末尾の空白を削除します。これにより、行をフィールドに分割する際に余分な空白を誤って含めないようになります。 - 空行をスキップする: 行が空の場合 (つまり、空白のみを含む場合)、
continue文を使用してその行をスキップします。これにより、空行を分割しようとしたときのエラーを回避できます。 - 行をフィールドに分割する:
split()メソッドを使用して、各行を空白を基準にフィールドのリストに分割します。これにより、行の各部分に個別にアクセスできるようになります。 - 関連するデータを抽出する: フィールドのリストから株式数と 1 株あたりの価格を抽出します。株式数は 2 番目のフィールドで、1 株あたりの価格は 3 番目のフィールドです。これらの値を適切なデータ型 (
株式数は int、価格は float) に変換して、算術演算を行えるようにします。 - コストを計算する: 株式数に 1 株あたりの価格を掛けて、この株式購入のコストを計算します。
- 総コストに追加する: この株式購入のコストを累計の総コストに追加します。
- デバッグ情報を表示する: 各株式購入に関する情報を表示して、何が起こっているかを確認します。これには、株式シンボル、株式数、1 株あたりの価格、および購入の総コストが含まれます。
それでは、このコードが動作するかどうかを確認するために実行しましょう。ターミナルを開き、以下のコマンドを実行します。
python3 ~/project/pcost.py
コマンドを実行した後、各株式購入に関する詳細情報が表示され、その後にポートフォリオの総コストが表示されるはずです。この出力により、関数が正しく動作していること、および総コストが正確に計算されていることを確認できます。
プログラムの完成
ここでは、コードを整理し、pcost.py プログラムの最終版を作成します。コードを整理するとは、不要な部分を削除し、出力が見やすくなるようにすることです。これは、コードをよりプロフェッショナルで理解しやすくするため、プログラミングにおいて重要なステップです。
まず、デバッグ用の print 文を削除します。これらの文は開発中に変数の値やプログラムの流れを確認するために使用されますが、最終版では必要ありません。次に、最終的な出力がきれいに整形されるようにします。
以下が pcost.py コードの最終版です。
## pcost.py
## 株式ポートフォリオの総コストを計算する
def portfolio_cost(filename):
"""
ポートフォリオファイルの総コスト (株式数*価格) を計算する
"""
total_cost = 0.0
try:
## ファイルを開く
with open(filename, 'r') as file:
## ファイル内のすべての行を読み取る
for line in file:
## 先頭と末尾の空白を削除する
line = line.strip()
## 空行をスキップする
if not line:
continue
## 行をフィールドに分割する
fields = line.split()
## 関連するデータを抽出する
## fields[0] は株式シンボル (計算には必要ない)
shares = int(fields[1]) ## 株式数 (2 番目のフィールド)
price = float(fields[2]) ## 1 株あたりの価格 (3 番目のフィールド)
## この株式購入のコストを計算し、総コストに追加する
total_cost += shares * price
except FileNotFoundError:
print(f"エラー: ファイル '{filename}' が見つかりませんでした")
return 0.0
except Exception as e:
print(f"ファイルの処理時にエラーが発生しました:{e}")
return 0.0
## 総コストを返す
return total_cost
## スクリプトが直接実行されたときに実行されるメインブロック
if __name__ == '__main__':
## ポートフォリオファイルを引数にして関数を呼び出す
total_cost = portfolio_cost('portfolio.dat')
print(f'総コスト:${total_cost:.2f}')
このコードの最終版にはいくつかの改善点があります。
- エラーハンドリング:2 種類のエラーを捕捉するコードを追加しました。指定されたファイルが存在しない場合、
FileNotFoundErrorが発生します。この場合、プログラムはエラーメッセージを表示し、0.0 を返します。Exceptionブロックは、ファイルの処理時に発生する可能性のある他のエラーを捕捉します。これにより、プログラムがより堅牢になり、予期せずクラッシュする可能性が低くなります。 - 適切な整形:総コストは、f-string 内の
:.2fフォーマット指定子を使用して小数点以下 2 桁に整形されます。これにより、出力がよりプロフェッショナルで読みやすくなります。 __name__ == '__main__'チェック:これは一般的な Python の慣用句です。これにより、ifブロック内のコードは、スクリプトが直接実行されたときにのみ実行されます。スクリプトが別のスクリプトにモジュールとしてインポートされた場合、このコードは実行されません。これにより、スクリプトの動作をより細かく制御できます。
それでは、最終コードを実行しましょう。ターミナルを開き、以下のコマンドを入力します。
python3 ~/project/pcost.py
このコマンドを実行すると、プログラムは portfolio.dat ファイルを読み取り、ポートフォリオの総コストを計算し、結果を表示します。ポートフォリオの総コストが表示されるはずで、その値は $44671.15 です。
おめでとうございます!ファイルからデータを読み取り、処理し、結果を計算する Python プログラムを成功させました。これは素晴らしい成果であり、あなたが熟練した Python プログラマーの道を歩んでいることを示しています。
まとめ
この実験では、Python で基本的なファイル入出力 (I/O) 操作を行う方法を学びました。open() 関数とコンテキストマネージャを使用してファイルを開き、読み取ることができ、データを一行ずつ処理し、テキストデータを解析し、計算を行い、エラーを処理し、関数とメインブロックを使って完全な Python プログラムを構築することができます。
これらのスキルは多くの Python プログラムにとって基本的なものであり、データ分析や設定管理などの様々なアプリケーションで役立ちます。コマンドライン引数の追加、異なるファイル形式の処理、エラーチェックの改善、より詳細なレポートの作成などによって、このプログラムをさらに拡張することができます。