schedule2018-07-19

15. 末尾のN行を出力

はじめに

言語処理100本ノック 2015

Pythonを勉強するため、東京工業大学の岡崎教授が出題されている言語処理100本ノック 2015を解いていきます。

より深く理解するため、別解や利用したライブラリの解説もまとめていきます。

環境

Python3.6

OS : mac
2章からUNIXコマンドの問題ですが、macもターミナルから利用できるようです。

問題

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

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

解答:Python

先頭からN行を出力.py

import sys


def readlines_file(file_name):
    with open(file_name, 'r') as file:
        return file.readlines()

N, file_name = sys.argv[1:3]


lines = readlines_file(file_name)

print("".join(lines[-1 * int(N):]))

コマンドと出力

$ python 末尾のN行を出力.py 2 hightemp.txt
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02

$ python 末尾のN行を出力.py 5 hightemp.txt
埼玉県  鳩山    39.9    1997-07-05
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02

解説

参考:コマンドライン引数

14. 先頭からN行を出力と同じく、sys.argvを使用してコマンドライン引数で受け取ります。

今回はpython 実行ファイル名.py N target_fileとして、引数を渡しました。

末尾を取得する場合は負の数を入れます。

print("".join(lines[-1 * int(N):]))

解答:UNIXコマンド

$ tail -n 5 hightemp.txt
埼玉県  鳩山    39.9    1997-07-05
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02

解説

tailはファイルの下から数行を確認できるコマンドです。

よくlogファイルの確認の時に利用します。

デフォルトでは10行表示します。

$ tail hightemp.txt
愛媛県  宇和島  40.2    1927-07-22
山形県  酒田    40.1    1978-08-03
岐阜県  美濃    40      2007-08-16
群馬県  前橋    40      2001-07-24
千葉県  茂原    39.9    2013-08-11
埼玉県  鳩山    39.9    1997-07-05
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02

続いての記事

Python3で言語処理100本ノックまとめ

前の問題 : 14. 先頭からN行を出力

次の問題 : 16. ファイルをN分割する