2018年02月13日

言語処理100本ノックでPython入門 #12 - テキストファイルの出力

  
本日は、言語処理100本ノック 2015の問題12に挑戦です。

■ 問題

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

12. 1列目をcol1.txtに,2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.


■ 最初に書いたPythonのコード
def solve(infile, outfile1, outfile2):
    col1 = []
    col2 = []
    with open(infile, 'r', encoding='utf8') as f:
        for line in f:
            words = line.split('\t')
            col1.append(words[0])
            col2.append(words[1])
    with open(outfile1, 'w', encoding='utf8') as f:
        for word in col1:
            f.write(word)
            f.write('\n')
    with open(outfile2, 'w', encoding='utf8') as f:
        f.writelines('\n'.join(col2))
        f.write('\n')

def main():
    solve1('hightemp.txt', 'col1.txt', 'col2.txt')

if __name__ == '__main__':
    main()


■ テキストファイルの出力

テキストファイルへの出力は、writeメソッドを使いますが、改行は付加してくれません。 writelineというメソッドはないので、以下のように書く必要があります。
with open(outfile1, 'w', encoding='utf8') as f:
    for word in col1:
        f.write(word)
        f.write('\n')

writelinesというメソッドもあるので、joinと組み合わせて、いっぺんに出力することもできます。 ただし、最後の行の改行が付加されないので、最後に改行コードを出力しています。
with open(outfile2, 'w', encoding='utf8') as f:
    f.writelines('\n'.join(col2))
    f.write('\n')


■ 複数のファイルを同時に開く

最初のコードは、いったん入力ファイルを閉じてから、col1.txt, col2.txtを出力しましたが、3つのファイルを一度に開く方法もあります。

with open(infile, 'r', encoding='utf8') as f, open(outfile1, 'w', encoding='utf8') as fw0, open(outfile2, 'w', encoding='utf8') as fw1:
    for line in f:
        words = line.split('\t')
        fw0.write(words[0] + '\n')
        fw1.write(words[1] + '\n')

でも1行が長すぎます。

バックスラッシュを使うと、複数行に分けられます。

with open(infile, 'r', encoding='utf8') as f, \
     open(outfile1, 'w', encoding='utf8') as fw0, \
     open(outfile2, 'w', encoding='utf8') as fw1:
    for line in f:
        words = line.split('\t')
        fw0.write(words[0] + '\n')
        fw1.write(words[1] + '\n')

このあたりが、僕の知っている言語と大きく違うところですね。


■ 最終版のPythonのコード

最終版のコードを示します。
def solve(infile, outfile1, outfile2):
    with open(infile, 'r', encoding='utf8') as f, \
         open(outfile1, 'w', encoding='utf8') as fw0, \
         open(outfile2, 'w', encoding='utf8') as fw1:
        for line in f:
            words = line.split('\t')
            fw0.write(words[0] + '\n')
            fw1.write(words[1] + '\n')
def main():
    solve('hightemp.txt', 'col1.txt', 'col2.txt')

if __name__ == '__main__':
    main()


■ 結果

col1.txt
高知県
埼玉県
岐阜県
山形県
山梨県
和歌山県
静岡県
山梨県
埼玉県
群馬県
群馬県
愛知県
千葉県
静岡県
愛媛県
山形県
岐阜県
群馬県
千葉県
埼玉県
大阪府
山梨県
山形県
愛知県

col2.txt
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋