最近、仕事で言語処理を扱うようになったので、業務時間の合間に東北大100本ノックでいろはから勉強しています。

第二章からアップしていきます。

2章のテーマ

2章のテーマはファイルの入出力を行います。指定のファイルの読み込みや、変形したファイルをOSのファイルシステム上に書き出します。

共通

#coding:utf-8

import os
import codecs
base_dir = "/path"
file_name = "hightemp.txt"
f = os.path.join(base_dir,file_name)

10.行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

# コーデックの処理
ff = codecs.open(f,'r','utf-8')
i = 0

for lines in ff.readlines():
    i += 1

ff.close()

print('ptyhonによる読み込み',str(i))

os上での確認

wc -l hightemp.txt

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

タブ1文字につきスペース1文字に置換せよ.
確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

ff = codecs.open(f,'r','utf-8')

for lines in ff.readlines():
    print(lines.replace('\t',' '))
ff.close()
# os上の確認
# sed -e 's/\t/ /g' /home/jovyan/work/study/tohoku100/hightemp.txt

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

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

ff = codecs.open(f,'r','utf-8')

f1 = os.path.join(base_dir,'co1.txt')
ff1 = codecs.open(f1,'w','utf-8')

f2 = os.path.join(base_dir,'co2.txt')
ff2 = codecs.open(f2,'w','utf-8')

for lines in ff.readlines():
    list = lines.split('\t')
    ff1.writelines(list[0] + '\n')
    ff2.writelines(list[1] + '\n')

ff.close()
ff1.close()
ff2.close()

# >cut -f 1,2 hightemp.txt

13. ファイルの結合 col1.txtとcol2.txtをマージ

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

f1 = os.path.join(base_dir,'co1.txt')
ff1 = codecs.open(f1,'r','utf-8')

f2 = os.path.join(base_dir,'co2.txt')
ff2 = codecs.open(f2,'r','utf-8')

f12 = os.path.join(base_dir,'col12.txt')
print(f12)
ff12 = codecs.open(f12,'w','utf-8')

for line1,line2 in zip(ff1.readlines(),ff2.readlines()):
    line1 = line1.replace('\n','')
    line2 = line2.replace('\n','')
    print(line1 + '\t' + line2)
    # ff12.writelines(line1 + '\t' + line2)
    ff12.writelines(line1 + '\t' + line2 + '\n')

ff1.close()
ff2.close()
ff12.close()

14. 先頭からN行を出力

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

→25以上を指定したときにきれいに24行目で終了するように調整した

# 任意に設定

n = 25

ff = codecs.open(f,'r','utf-8')
i = 0

while True:
    line = ff.readline()
    print(str(i + 1),line)
    i += 1
    if i >=  n - 1:
        break

ff.close()
head -n 25 hightemp.txt

15. 末尾のN行を出力(詰まってます)

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

→これ詰まってます。 reversedを使うのか?

やろうとしたいこと

# 任意に設定
n = 5

ff = list(codecs.open(f,'r','utf-8'))

i = 0
while True:
    line = reversed(ff).readlines
    print(str(i + 1),line)
    i += 1
    if i >=  n - 1:
        break

参考URL

言語処理100本ノック 2015
http://www.cl.ecei.tohoku.ac.jp/nlp100/

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.