2018年02月18日

言語処理100本ノックでPython入門 #14 - コマンドラインパラメータ、標準出力

  
言語処理100本ノック 2015の問題14に挑戦です。

■ 問題

hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

14. 先頭からN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.


■ Pythonのコード
import sys
def head(fin, fout, count): for _ in range(count): line = fin.readline() fout.write(line)
def main(): n = int(sys.argv[1]) with open('hightemp.txt', 'r', encoding='utf8') as f: head(f, sys.stdout, n)
if __name__ == '__main__': main()

■ 今回のトピックなど

コマンドラインからパラメータを受け取る

1番目のパラメータは、sys.argv[1]。 sys.argv[0]は、自分自身のプログラムパスが入ります。


文字列を数値(integer)に変換
n = int("14")  
nには、int 14が代入されます。 これって、文法的にはintのコンストラクタ呼び出しなんだろうか?それともint関数なんだろうか?


標準出力 sys.stdout

printではなく、sys.stdoutを使い、標準出力に文字列を出力してみました。
sysをimportすれば利用できます。
import sys
f = sys.stdout f.write(line)
write(line)は、それ自身では改行しません。でもlineそのものに改行コードが入っているので、これでOKです。


標準入力 sys.stdin 

ちなみに、標準入力はsys.stdinを使います。 以下のように使います。
import sys
f = sys.stdin line = f.readline()
lineには改行コードが入っています。


ループ変数を省略

今回の例では、n回繰り返したいだけで、ループ変数は必要ありません。
前にも書いた気がするけど、そんなときには、_ を使えば良いです。


■ 結果

コマンドの引数に5を指定した場合の結果です。
$ python nlp14.py 5

高知県  江川崎  41      2013-08-12
埼玉県  熊谷    40.9    2007-08-16
岐阜県  多治見  40.9    2007-08-16
山形県  山形    40.8    1933-07-25
山梨県  甲府    40.7    2013-08-10