9 スクリプトの文字符号化 9 コマンドライン実行に渡されるパラメータ引数

Python 配布プリント (9) by 水谷正大
http://www.ic.daito.ac.jp/~mizutani/python/index.html
スクリプトのコマンド実行時に、次のように英文テキストファイル名 document.txt を渡して、その英文テ
キストに登場する単語とその登場回数からなる単語頻度ファイルを作成するスクリプト make dictionary.py
の作成を目標にしてみよう(ただし、apple と apples を同じ単語と見なすような文法的処理は行わず、違う単
語と扱う)。
make dictionary.py の使い方
$ python make_dictionary.py document.txt
このために必要な処理は次のようなものである。
1. ファイルの入出力
2. 文字列操作
• 文字列の小文字化
• 部分文字列の検索と置き換え
• 区切り文字列による文字列のリスト分解
3. リスト操作
• リスト要素の追加
• 重複したリスト要素を数える
4. ディクショナリ型データの作成
9 スクリプトの文字符号化
テキストは文字符号化 UTF-8 で保存しよう。日本語 Windows のデフォルト符号化 Shift JIS では、多言
語文字が混在したテキストを保存できないためだ(Windows 内部では UTF-8 で処理が行われているのだが)
。
今後全てのテキストは UTF-8 で保存することを強く勧める。
[問題 1] 上の大統領演説テキストを文字コード UTF-8 にしてファイル名 obama speech in hiroshima.txt
保存せよ。
Pythion2 では書かれているスクリプトの先頭で文字コードを宣言する必要がある。utf-8 で保存された
python スクリプトでは次のように書く。
UTF-8 で保存された python スクリプトの先頭
# -*- coding: utf-8 -*以下にスクリプトが続く
ただし、宣言された文字符号と実際に保存されている文字符号化を一致させることはプログラマの責任だ。
9 コマンドライン実行に渡されるパラメータ引数を確認
スクリプト先頭に文字符号化を明記したので、コメントも日本語が使える :-) スクリプトでは、モジュー
ル sys を読み込んで、OS 回りの I/O を取り扱えるようにしている。
arguments.py
# -*- coding: utf-8 -*# コマンドライン実行時に渡されるパラメータを検証
# 利用法
# $ python arguments.py arg1 arg2 ....
import sys
1
for st in sys.argv:
print st
[問題 2] 上のスクリプトを、たとえば次のように実行した結果を説明せよ。
$ python arguments.py para1 para2 para3
10 ファイルを読み出し専用で開く
指定したファイルをファイルオブジェクト (file object) と結びつけた後、テキストファイルを読み込むには
そのファイルオブジェクトへの操作として次の3つの方法がある。その “同等さ” と差異を正確に理解してお
くことが重要だ。
ここではコマンドライン引数で指定したファイル内容を表示するスクリプト(unix/Linux では cat という
われているコマンド)cat1.py、cat2.py、cat3.py を 3 つの方法で示す。たとえば、スクリプト cat2.py
を使ってファイル cat1.py の内容を表示するには次のように使う。
$ python cat2.py cat1.py
10.1 メソッド read() を使う
テキストファイル全てを 1 つの文字列 str に読み込み、その 1 つの文字列 str をプリントすることでファ
イル内容を表示する。
fh = open(sys.argv[1], ’r’) は、コマンドラインの 1 番目の引数で指定された目的のファイルを読み
出し専用モード ’r’ で開いてファイルオブジェクトを生成、これを変数 fh に代入している。モード ’r’ で
はファイル内容の変更は許されない。
cat1.py
# -*- coding: utf-8 -*fh = open(sys.argv[1], ’r’)
str = fh.read()
print str
10.2 メソッド readlines() を使う
テキストファイルを 1 行(行頭から次の改行文字まで)ごとに読んで、(行末の改行文字も含んだ)文字列
を要素とするリスト lines として、一括して読み出す。リスト lines の要素を先頭から文字列を 1 つずつ
lines として読み出し、これを繰り返してァイル内容を表示する(以下のプリント文では毎回改行される)。
cat2.py
# -*- coding: utf-8 -*fh = open(sys.argv[1], ’r’)
lines = fh.readlines()
for line in lines:
print line
2
10.3 メソッド readline() を使う
テキストファイルから 1 行(行頭から次の改行文字まで)ずつ line に読んで、これが空 (False)なない
限り、文字列 lines 書き出して、次の行を読み出す。これを読み出す行が無くなるまで続ける。
cat3.py
# -*- coding: utf-8 -*fh = open(sys.argv[1], ’r’)
line = fh.readline()
while line:
print line
line = fh.readline()
[問題 3] cat1.py、cat2.py、cat3.py を使って、そのどれかのファイルを 3 通りの方法で内容表示させ、そ
の違いを言語化して説明せよ。
3