A11 [授業内]

A11_1 (スクリプト)

ねらい: テキストファイルへ情報を書き込む方法を学習する.まずは1行.

datetime モジュールを用いて現在の日時を取得し,得られた日時を str() を用いることで以下のフォーマットの文字列に変換して,テキストファイル now.txt に出力するプログラムを作成せよ.

年(4桁)-月(2桁)-日(2桁) 時(2桁):分(2桁):秒(2桁).マイクロ秒(6桁)

スクリプト実行後に作成されるテキストファイル now.txt の内容の例:

2023-12-09 18:13:32.382681

出力結果が妥当であるかは,テキストエディタで now.txt を開いて確認せよ. 本課題では,実行結果として,スクリーンショットではなく,作成されたテキストファイル now.txt を提出せよ.

なお,ファイルが入出力されるフォルダは,指定がなされない場合,スクリプト実行時のカレントフォルダである.


コラム: 様々なデータ型が文字列に変換できる仕組み

文字列への変換が可能なのは,データ型が表示に適した文字列表現を得る特殊メソッド __str__() を定義しているからである.組み込み関数 print() は特殊メソッド __str__() の呼び出しで得られた文字列を表示する.

この他にも様々な特殊メソッドがあり,自作のデータ型でも定義して活用可能である.詳しくは特殊メソッド名を参照せよ.


A11_2 (スクリプト)

ねらい: テキストファイルから情報を読み込む方法を学習する.まずは1行.

課題A11_1で作成したテキストファイル now.txt を1行読み込み,まず画面にそのまま表示せよ. その後で,文字列を適切に処理し,「1969年7月20日 20時18分4秒」といった形式で表示せよ.数字が1桁になる場合,十の位の0は表示しないようにせよ.

出力例:

2023-12-09 18:13:32.382681
2023年12月9日 18時13分32秒

以下のようなエラーが出る場合,ファイル now.txt の存在しているフォルダが適切かどうかを確認せよ.

Traceback (most recent call last):
  File "Z:\lecture\PROG1\exercise\ab11\a11_2.py", line 1, in <module>
    f = open('now.txt', 'rt')
FileNotFoundError: [Errno 2] No such file or directory: 'now.txt'


A11_3 (スクリプト)

ねらい: テキストファイルから複数行を読み込み,数値として処理する.

3軸加速度センサで計測された加速度のx,y,z成分が,テキストファイル acc.csv (右クリック→名前を付けてリンク先を保存) に記録されている. 各行にはカンマ(,)で区切られた数値が4個記録されており,順に計測時刻(単位: ms),x成分(単位: G),y成分(単位: G),z成分(単位: G)を表している.Gは地球の重力加速度を1とする加速度の単位である.

acc.csv を読み込み,x成分,y成分,z成分のそれぞれについて,平均値,最大値,最小値を求めて画面に出力するプログラムを作成せよ.

acc.csv の冒頭3行を以下に示す.

0,-0.052749,0.183105,-0.008211
13,-0.023156,0.146114,0.021382
27,-0.060147,0.234892,0.006586

プログラムを作成する前に,まずはエディタで acc.csv を開いて,ファイルにデータが格納されているフォーマットを確認せよ.

必要であれば,Python の組み込み関数 sum(),max(),min() を使用してよい. ただし,Pythonの標準モジュール csv や,NumPy,Pandas等が提供するCSVファイルを読み込む機能は使用してはならない(A11/B11のいずれの課題でも同様である).

アドバイス1: 正しく読み込めていることを確認するために,課題A11_2と同様に,まず読み込んだ各行をそのまま画面に出力してみることを推奨する.

アドバイス2: 関数を自作する練習として,CSVファイルから読み込まれた1行分の文字列を引数として与えると,計測時刻と加速度の3成分の計4個の数値をタプルとして返す関数や,数値が記載されたリストを与えると平均値,最大値,最小値の計3個の数値をタプルとして返す関数を作成することを推奨する.


コラム: CSVファイル

acc.csv のようにカンマで区切られたデータが並んだテキスト形式のデータファイルをCSVファイルと呼ぶ. CSVは Comma Separated Values の略である. またCSVファイルの拡張子は一般的に .csv である. 入出力とも容易に行えるため,幅広く使われている.

PythonにはCSVファイルを扱うためのモジュール csv が用意されている.加えて数値演算パッケージ NumPy やデータ解析パッケージ pandas も,それぞれCSVファイルを読み書きする機能を有している. 実践的なプログラムの開発時には,これらのパッケージが提供する機能を使用するのがよいが,本日の課題はテキストファイルの扱いに習熟することが目的であるため,汎用的なファイル入出力方法を用いて読み書きを行う.


A11_4 (スクリプト)

ねらい: テキストファイルから複数行を読み込み,処理を行った結果を追加して別のファイルに書き出す.

課題A11_3と同じCSVファイルを読み込み,各時刻の速度(単位:m/s)のx,y,z成分を算出して,元のデータ(計測時刻,加速度の各成分)の後ろに加えて,新たなCSVファイル acc_vel.csv として出力せよ.

計測されている加速度の単位はGであるため,適切に変換せよ.1 G = 9.8 m/s2である.加速度は速度の変化率であるため,加速度で時間の間運動した場合の速度変化である.物体は初期状態では静止している(すなわち速度の各成分はすべて0).

本課題では,実行結果として,スクリーンショットではなく,作成されたCSVファイル acc_vel.csv を提出せよ.


A11_5 (スクリプト)

ねらい: 日本語を含んだテキストファイルの読み書きを行う.

テキストファイル neko.txt (右クリック→名前を付けてリンク先を保存) を読み込み,行番号を先頭に付けて,別のテキストファイル neko_num.txt に出力するプログラムを作成せよ. 行番号は1から始まるものとする.

日本語を含むファイルの読み書きについては,後述する「日本語を含むファイルの読み書き」を必ず確認せよ.

出力結果が妥当であるかは,テキストエディタで neko.txt および neko_num.txt を開いて確認せよ. 本課題では,実行結果として,スクリーンショットではなく,作成されたテキストファイル neko_num.txt を提出せよ.


日本語を含むファイルの読み書き

テキストファイルの内容に日本語が含まれている(正確には,UTF-8で符号化されている)場合,ファイルを読み書きする際の符号化形式(エンコーディング)を UTF-8 に指定する必要がある.

参考: 文字エンコーディング

関数 open() にキーワード引数 encoding='utf-8' を指定することで,ファイルのエンコーディングを UTF-8 として取り扱うことができる.

以下に例を示す.

ファイル japanese.txt をオープンし,最初の1行を表示するスクリプト

f = open('japanese.txt', 'rt', encoding='utf-8')
print(f.readline().strip())
f.close()
ファイル japanese.txt の内容
古池や
蛙飛びこむ
水の音
実行結果
古池や
Windows で encoding='utf-8' を指定せずに日本語を含むファイルをオープンしようとした場合は,以下に示すエラーとなる (macOSの場合は,デフォルトのエンコーディングが UTF-8 のため,未指定でもオープンできる).
Traceback (most recent call last):
  File "z:\lecture\PROG1\exercise\AB11\japanese.py", line 2, in <module>
    print(f.readline())
UnicodeDecodeError: 'cp932' codec can't decode byte 0x84 in position 8: illegal multibyte sequence