LoginSignup
0
0

More than 3 years have passed since last update.

Pythonひよっこが『言語処理100本ノック 2020』に挑戦【10-14】

Last updated at Posted at 2020-05-16

Pythonひよっこのわたしが、『言語処理100本ノック 2020』の第2章の前半部分に挑戦してみました。
一般の方が公開されている解答と比べながら、1問ずつ学んだことなどをまとめていきたいと思います。

こちらの続きになります。
Pythonひよっこが『言語処理100本ノック 2020』に挑戦【06-09】

第2章:UNIXコマンド

10.行数のカウント

#10.
f=open('popular-names.txt','r')
print(len(f.readlines()))
f.close()
wc -l popular-names.txt

→ターミナルでwcコマンドを使って確認しました。

wcコマンドを使ったことがなかったので、いろいろと調べながら進めました。
readlines()はファイルのすべての行を読み込んでリストに入れたものを返すので、 このリストの長さ=ファイルの行数 であることに早めに気づけたので本体はさくっとかけました。

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

#11.
f=open('popular-names.txt','r')
f_new=open('popular-names_11.txt','w')

text=f.read()

f_new.write(text.replace('\t',' '))

f.close()
f_new.close()
cat popular-names.txt | tr '\t' ' '

→trコマンドを使ってみました。

新しくできたファイル'popular-names_11.txt'はちゃんとスペースで区切られたテキストファイルになっていました!!
sedコマンドでは、'\t'が受理されなかったので trコマンドを使いました。

12.1列目をcol1.txtに、2列目をcol2.txtに保存

#12.
f=open('popular-names.txt_11','r')
f_new1=open('col1.txt','w')
f_new2=open('col2.txt','w')
text=f.readlines()

for i in range(2780):
    text_new=text[i].split(' ')
    f_new1.write(text_new[0]+"\n")
    f_new2.write(text_new[1]+"\n")

f.close()
f_new1.close()
f_new2.close()

→cutコマンドで "\t" が使えなかったので、11.で作成した、スペースで区切られた方のファイルを使いました。

cut -f 1 -d " " popular-names_11.txt   
cut -f 2 -d " " popular-names_11.txt

→ターミナルでcutコマンドを使って確認しました。

for文のrangeで10.で求めた行数を使ってしまったのですが、あまり良くないですよね...
ほかの方の解答でpandasを使ったものがありました。
pandasをちゃんと勉強したことがなかったので細かいところまで見れていませんが、いろいろと便利なものがあるみたいなので今後手を出していきたいです。

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

#13.
f=open('popular-names_13.txt','w')
f_1=open('col1.txt','r')
f_2=open('col2.txt','r')

for i in range(2780):
    f.write(f_1.readline().replace("\n","\t")+f_2.readline())

f.close()
f_1.close()
f_2.close()
paste col1.txt col2.txt

→ターミナルでpasteコマンドを使って確認しました。

相変わらずfor文のrange()は要改善ですが、ノータイムで実装できました。
readline()でとってきた要素はどちらも \n が入っているので、col1.txtのものはタブと置き換える必要があります。(ここで最初つまずいてしまいました。)

14.先頭からN行を出力

#14.
def print_func(N):
    f=open('popular-names.txt','r')

    for _ in range(N):
        print(f.readline())
    f.close()

print_func(4)
head -n 4 popular-names.txt

→ターミナルでheadコマンドを使って確認しました。

jupyter notebookでのコマンドライン引数の使い方がわからなかったので、題意を満たす関数:print_funcを定義し、そこに引数として出力する行数:N を渡すことにしました。
きっと、問題と同じようなことを実装できたと思います...

おわりに

UNIXコマンドが全然ピンと来ないので、どの問題も調べながら使っています。
むずかしい、というより、なかなか慣れないです...

ゼミの本読みが溜まってしまっているので、それが落ち着いたら続きに取り組もうと思います!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0