schedule2018-07-21

11. タブをスペースに置換

はじめに

言語処理100本ノック 2015

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 OSX で sedを使ってtabの文字列を置換

macではCtl+vと押してからtabを入力する必要があります。

続いての記事

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

前の問題:10. 行数のカウント

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