プログラミング入門II
2025.06.18
ファイル処理
Back to index page
- 本日の作業内容
- 確認テストについて
授業の最初にユーザ定義関数・モジュールに関する確認テストを行いますので,しっかり準備してきてください.
- 前回の宿題について
- 前回の復習
モジュールについていろいろと学習しました.基本的には教科書にある通りですが,実際の開発作業では必須のものではあるものの,一人で作業しているときにはあまり有難味を感じないのも事実です.これまでに作りためたプログラムを活用していくようなことを少し取り入れていければと思います.
- ファイル処理
今回はファイル処理です.実際に実験などで得られたCSVファイルを読み込んで処理したり,計算結果をCSVファイルとして書き出したりすることは頻繁に行われることです.今回はCSV形式のテキストファイルについての読み込みと書き出しについて学習します.
CSV とは Comma Separeted Value の略で,カンマ(コンマ)で区切られたデータ群のことです.ただし,区切り記号はカンマ以外にもスペースやタブなどが使われることもよくありますし,データを2重引用符 " で括る方式と括らない方式など,いくつかバリエーションもあります.今回はデータテキストはそのまま,区切り記号はカンマに限定して作業します.
CSVデータの扱い
Python は現在機械学習などを始めとしてデータ処理に多く利用されています.この分野では処理したデータをCSVファイルとして保存したり,CSVファイルを読み込んで処理したり,という作業が多くなります.そのため,Python には pandas や NumPy というデータ解析に便利なライブラリやツールが準備されていますが,今回は標準で用意されている CSV モジュールを使った方法を学習しましょう.
- モジュールの読み込み
次のように import 文を用意します.
- with 文によるファイル読み込み
以下のような内容のデータが numbers.csv というファイル名でカレントディレクトリにあるとするとき,そのデータを読み込んで numbers というリストに保存する処理を考えます.
教科書 p.360 にある with 文を使用して以下のようにしてみます.
import csv
with open('numbers.csv', 'r') as f:
data = csv.reader(f)
numbers = [n for n in data]
print(numbers)
f.close()
|
使用するエディタによって色分けなどが違いはしますが,上のソースですと,色が付いている部分が予約語や関数です.それ以外の部分は自分で適当に名前をつけてよい変数やリストです.
- 読み込みデータの数値化
先程のコードを実行すると,出力結果が以下のようになったはずです.
[['1', '2', '3', '4'], ['5', '6', '7', '8']]
|
ここで,reader という関数がデータを行単位で読み込んでくれています.
データはちゃんと読み込めましたが,数値はシングルクオート ' ' で囲まれていますので,文字列です.計算などで使用するためには数値でないと困ります.
EXCEL で読み込んだ場合はテキストでも自動で数値化してくれるので計算に使用できます.
教科書 p.36 で int 関数が紹介されていますが,それを使用することで整数に変換することができます.ということで,数値化してみましょう.
import csv
with open('numbers.csv', 'r') as f:
data = csv.reader(f)
num_txt = [n for n in data]
numbers = [[int(num_txt[i][j]) for j in range(0,4)] for i in range(0,2)]
print(numbers)
f.close()
|
上のソースの中では,7行目のリスト numbers の作成における内包表記表現の添字 i と j に注意してください.内包表現では内側のリストの添字を j とし,外側のリストの添字を i とすることが慣例ですので,まず j についての値を操作し,次に外側で i についての操作を行っています.
- データ書き込み
numbers というリストは2次元のリストになっていますが,内側のリストの和を要素として持つ num_sum というリストを作り,それを num_sum.csv というファイルに書き込んで保存することを行ってみましょう.
import csv
with open('numbers.csv', 'r') as f:
data = csv.reader(f)
num_txt = [n for n in data]
numbers = [[int(num_txt[i][j]) for j in range(0,4)] for i in range(0,2)]
num_sum = [sum(numbers[i]) for i in range(len(numbers))]
with open('num_sum.csv', 'w') as ff:
save_data = csv.writer(ff)
save_data.writerow(num_sum)
f.close()
ff.close()
|
再び with 文が登場しますが,今回は書き込みです.writer() 関数を使用しますが,1行書き込む writerow で書き込んでいます.
書き込むデータが複数行に渡るときは最後の行は writerows() を使います.
- 演習
今回の演習問題です.
- 宿題
いつものようにレポート提出システムを利用します.授業当日の18:00から閲覧可能で,締切りは23日火曜日の10:00です.
- 次回の予習範囲
次回もファイル処理です.教引き続き科書のp.354-373の範囲を学習しますので,予習をしてきてください.
目次ページに戻る