はじめに
Pythonを勉強するため、東京工業大学の岡崎教授が出題されている言語処理100本ノック 2015を解いていきます。
より深く理解するため、別解や利用したライブラリの解説もまとめていきます。
環境
Python3.6
OS : mac
2章からUNIXコマンドの問題ですが、macもターミナルから利用できるようです。
問題
hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.
11. タブをスペースに置換 タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
解答:Python
import re
with open('hightemp.txt', 'r') as file:
text = re.sub(r'\t', '\s', file.read())
print(text)
出力
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 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
解説
fileはwithと一緒に使おう
ファイルを扱うときは、with
を使うと便利です。
その前に、レガシーな書き方をみてみましょう。
file = open("file_name", "r")
# fileの処理
print(file.read())
file.close() # 必ず閉じる!
ファイルの読み書きは、必ずclose()
で閉じる必要があります。
ファイルをクローズしないと
- システムのリソースを食ったまま
- 他のプログラムがファイルにアクセスできなくなる
などのリスクがあります。
忘れっぽい人のためにあるのが、with
です。
with open('file_name.txt', 'r') as file:
text = file.read())
with
の範囲を抜けたとき、勝手にクローズしてくれます。
close()
の心配もなく記述もスマートになるため、fileはwithと一緒に使いましょう。
text = re.sub(r'\t', '\s', file.read())
ここで、タブを全て半角スペースに変換しています。
file.read()
は、読み込んだファイルの内容を全て文字列として得ます。
解答:UNIXコマンド
$ sed 's/ / /g' hightemp.txt
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 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
解説
sedコマンドはsed -e 's/検索文字列/置換文字列/g' 入力.txt > 出力.txt
とあり、文字列を置換することができます。
UNIXだとsed 's/\t/ /g' hightemp.txt
でできるそうなんですが、macだと\t
でタブと解釈してくれないようです。
macではCtl
+v
と押してからtab
を入力する必要があります。
続いての記事
前の問題:10. 行数のカウント