Pythonひよっこのわたしが、『言語処理100本ノック 2020』の第2章の15・16に挑戦してみました。
どちらのコードも長くなってしまったので、今回はふたつだけにしました。
わたしが作った解答と一般の方が公開されている解答と比べながら、1問ずつ学んだことなどをまとめていきたいと思います。
こちらの続きになります。
Pythonひよっこが『言語処理100本ノック 2020』に挑戦【10-14】
#第2章:UNIXコマンド
##15. 末尾のN行を出力
はじめはリストのスライスを使ってスマートに書いてみたのですが...
#15.
def print_func(N):
f=open("popular-names.txt",'r')
text=f.readlines()
print(text[-1*N :])
f.close()
print_func(5)
出力すると...
['Benjamin\tM\t13381\t2018\n', 'Elijah\tM\t12886\t2018\n', 'Lucas\tM\t12585\t2018\n', 'Mason\tM\t12435\t2018\n', 'Logan\tM\t12352\t2018\n']
...これじゃだめですね(><)
リストのスライスで出力すると、リストの形でタブとかも変換されずに出力されてしまいました...
1行ずつ出力する分にはちゃんと出力できたので、
#15-2.
def print_func2(N):
f=open("popular-names.txt",'r')
text=f.readlines()
for x in range(N):
print(text[-1*(x+1)].replace("\n",""))
f.close()
print_func2(5)
for文を追加して、このように変更しました。すると...
Logan M 12352 2018
Mason M 12435 2018
Lucas M 12585 2018
Elijah M 12886 2018
Benjamin M 13381 2018
思っていた通りに出力することができました!
今回、実装自体はうまくいきませんでしたが、『リストの末行を取得→引数を負の数にする』を自分で思い出せたのでよかったです。
出力で、無駄に1回改行を挟んでしまっていたので replace() を使いましたが、調べたらprint() に end=* を与えることで改行しないprintができることがわかりました。
機会があれば実践したいです。
::
tail -n 5 popular-names.txt
→ターミナルにて、tailコマンドを使って確かめました。
tailコマンドは14.のheadコマンドと同じ使い方ですね。
##16.ファイルをN分割する
#16.
##output_16_*.txt のかたちでファイルを作る
##ながれ
##1.分割数を知る@split_N関数
##2.ラベル作る→ファイルを作る@make_file関数
##3.ファイルに文をwriteする@file_write関数
##x個目のファイルを作る
def make_file(x):
new_output_name="output_16_" + str(x) + ".txt"
f_out=open(new_output_name,'w')
return f_out
##ファイルに書き込む
def file_write(file_name,raw_num,text):
file_name.write("".join(text))
file_name.close()
def split_N(N):
f=open("popular-names.txt",'r')
text=f.readlines()
#行数(1~N-1このファイル)
raw_num=len(text)//N
for x in range(N):
#1~N-1個目
if x!= N-1 :
file_write(make_file(x+1),raw_num,text[x*raw_num:x*raw_num+raw_num])
#N個目→のこり全部をいれる
else:
file_write(make_file(x+1),raw_num,text[x*raw_num:])
f.close()
split_N(6)
あえて2780(popular-names.txtの行数)の因数でない、6分割にしてみました。
ちゃんと、output_16_1~5が463行、output_16_6が465行でファイルができていました。
(あまりの行はすべて最後のファイルに押し込んでいます)
こちらはちゃんとかけたのですが、splitコマンドを使った実行ができませんでした...
調べた感じだと、splitコマンドは行数やbyte数を指定して分割するように、こちらが分割する大きさを与えないと使えないようです....
仕方ないので行数(今回は6分割なので、ひとつ463行)を指定しましたが...
split -l 463 popular-names.txt output_16_split_
これでは、予想通り、ファイルは7こ作成されてしまいました(><)
良い方法があれば教えていただけると幸いです...
#おわりに
ファイルの入出力に慣れてきました。
細かいところは試行錯誤ですが、ちょっとレベルアップできている気がしています。
この調子でがんばります!