schedule2018-07-19

13. col1.txtとcol2.txtをマージ

はじめに

言語処理100本ノック 2015

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

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

環境

Python3.6

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

問題

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

13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

解答:Python

def readlines_file(file_name):
    # 行毎のリストを返す
    with open(file_name, 'r') as file:
        return file.readlines()


def save_file(file_name, text):
    with open(file_name, 'w') as file:
        file.write(text)

# 読み込んだファイルをlist型で受け取る
cal1 = readlines_file('cal1.txt')
cal2 = readlines_file('cal2.txt')

# 改行や空白文字を削除
cal1 = list(map(lambda x: x.strip(), cal1))
cal2 = list(map(lambda x: x.strip(), cal2))

# タブ区切りで並べたリストを作成
lines = ["{0}\t{1}".format(line1, line2) for line1, line2 in zip(cal1, cal2)]

save_file('marge.txt', "".join(lines))

出力

marge.txt

高知県\t江川崎
埼玉県\t熊谷
岐阜県\t多治見
山形県\t山形
山梨県\t甲府
和歌山県\tかつらぎ
静岡県\t天竜
山梨県\t勝沼
埼玉県\t越谷
群馬県\t館林
群馬県\t上里見
愛知県\t愛西
千葉県\t牛久
静岡県\t佐久間
愛媛県\t宇和島
山形県\t酒田
岐阜県\t美濃
群馬県\t前橋
千葉県\t茂原
埼玉県\t鳩山
大阪府\t豊中
山梨県\t大月
山形県\t鶴岡
愛知県\t名古屋

解説

読み込んだファイルを行単位で扱うためにreadlines()を使いました。

高知県\t江川崎
埼玉県\t熊谷
岐阜県\t多治見

このようなファイルを readlines()を使ってリスト化すると、

lines = f.readlines()
print(lines)
# => ['高知県', '埼玉県', '岐阜県']

こうなります。

改行文字が残ってますね。他にタブがあるときは\tがあったりします。

# 改行や空白文字を削除
cal1 = list(map(lambda x: x.strip(), cal1))

そこで、strip()を使って前後の空白文字を取り除きました。

# タブ区切りで並べたリストを作成
lines = ["{0}\t{1}".format(line1, line2) for line1, line2 in zip(cal1, cal2)]

2つのリストを同時に扱うため、zip()を使います。
また、"{0}\t{1}".format()でタブ区切りの文字列を作りました。

解答:UNIXコマンド

$ paste cal1.txt cal2.txt > marge.txt

解説

pasteはファイルを列方向に結合するコマンドです。

$ paste f1.txt f2.txt`として、ファイルを指定すると結合してくれます。

詳しくはpasteコマンドについて詳しくまとめました 【Linuxコマンド集】です。

続いての記事

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

前の問題:12. 1列目をcol1.txtに,2列目をcol2.txtに保存

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