はじめに
今回もPython基礎です。ファイル操作を扱います。実はずっと苦手にしていたので、一度整理したかったの良い機会です。「みんなのPython」(SB Creative)からの引用です。
Pythonではファイルを操作するためには、open()という組み込みの関数を使用します。この関数を呼び出すと、ファイルを操作するためのファイルオブジェクトが返ってきます。 この関数を呼び出すと、ファイルを操作するためのファイルオブジェクトが返ってきます。関数の戻り値として返ってくるファイルオブジェクトを変数に代入するなどして、ファイルを読み書きするときに使います。
この通りなのですが、なんだかよくわからないくないですか?こういうのって、実際に試すのが一番だと思います。そこで、次のようなtxtファイルを使って、実際に試していきましょう。
(20200405.txt)
1行目:今日はファイル操作を練習します。
2行目:ファイルを開きます。
3行目:ファイルを閉じます。
4行目:ファイルオブジェクトを使って読み込みます。
5行目:ファイルの書き込みも学びましょう。
ファイルの読み込み方
冒頭に記載したように、ファイルを開くのはopen()関数です。open()関数は、次のような書式となります。
open(開くファイルの名前[, モード[, エンコード[, エラー処理]]])
ここでは、2020405.txtというファイルを開いてみましょう。開いたファイルをfhという変数に代入して、その中身を表示させてみましょう。
fh=open('20200405.txt',encoding='utf-8')
for line in fh:
print(line)
fh.close()
まず、open()関数でファイルを開いて、fhという変数に代入しています。fhから1行ずつ取り出して表示しているのが、for文のブロックです。元のテキストファイルは空行がないのですが、print文は自動的に改行が差し込まれるため、このような表示なります。これを回避するには次のようにします。
fh=open('20200405.txt',encoding='utf-8')
for line in fh:
newline=line.rstrip()
print(newline)
fh.close()
rstrip()は、行末にある、改行やタブなどの記号を除去します。この例では\nという改行が除去され、print文により改行が挿入されるため、元のファイルと同じように表示させることがdけいます。
表示させるのではなく、リストに格納するには次のようにします。
fh=open('20200405.txt',encoding='utf-8')
lists=[]
for line in fh:
lists.append(line)
lists
空のリストを用意してappendで次々と要素を追加していくのは、これまで学んできたものですね。ファイルの内容がリストに追加できています。
このような形でファイルをopen()した場合には、必ず最後にファイルオブジェクトをcloseする必要があります。閉じたファイルに対しては、読み書きができなくなり、読み書きをしようとするとエラーになります。
このclose()という処理を指定せずにopen()とclose()を自動化する書き方がwith文となります。同じことをwithを用いて書くと、次のようになります。
with open('20200405.txt',encoding='utf-8') as fh:
for line in fh:
newline=line.rstrip()
print(newline)
このように書いておくと、withを抜けたときにclose()が自動で実行されます。この閉じる、という処理は読み込みの時には大した問題とならないが、書き込みの時には、大きな問題となる。
ファイルの書き込み方
ファイルに書き込む場合にもファイルオブジェクトを使います。ファイルをopen()関数を呼び出すときは、書き込みに適切なモードを指定しておく必要があります。リストをファイルに書きだすことをやってみましょう。
testlist=['a','b','c','d','e','f']
fh=open('newfile.txt','w',encoding='utf-8')
for c in testlist:
fh.write(c)
開いたファイルメソッドには、write()というメソッドがあるので、fh.write(c)として順々に書き込みをしている。但し、この状態で作成されたnewfile.txtは0byteで中身が書き込まれていない。
書き込みが終わった後、close()の処理をして初めて書き込みが完了する。この点が注意となる。
testlist=['a','b','c','d','e','f']
fh=open('newfile.txt','w',encoding='utf-8')
for c in testlist:
fh.write(c)
fh.close()
すると、newfile.txtには次のように書き込まれる。
上のコードではリストから要素をひとつずつ取り出して、書き出しているだけなので、改行や区切り文字がない状態となる。改行して表示したければ次のようにする。
testlist=['a','b','c','d','e','f']
fh=open('newfile.txt','w',encoding='utf-8')
for c in testlist:
writestr='%s\n'%c
fh.write(writestr)
fh.close()
これをwith文で書くと次のようになる。
testlist=['a','b','c','d','e','f']
with open('newfile.txt','w',encoding='utf-8') as fh:
for c in testlist:
writestr='%s\n'%c
fh.write(writestr)
問題
らくだ
きりん
ぞう
らくだ
らくだ
らくだ
うさぎ
うさぎ
と記載されたテキストファイル、animal_list.txtがあります。これを読み込んでリストを作成し、それぞれの要素をカウントして、{‘らくだ’:3, ‘きりん’:2,.. }のような辞書を動的に作成し、最終的に、
らくだ:xx,
きりん:xx,
・・・
のように表示させてください。
解答
まず、辞書を作るところまでのコードをみてみましょう。次のように書くことができます。
with open('animal_list.txt',encoding='utf-8') as fh:
dic={}
for line in fh:
line=line.rstrip()
if line in dic.keys():
dic[line]+=1
else:
dic[line]=1
dic
次に最終的に動物の数を表示する部分は、次のように書けます。
for key,value in dic.items():
print('%s:%d'%(key,value))
まとめ
いかがでしょうか?書きながら、ファイルのところが初めて理解できた気がしました!いままで、あまり必要に迫られず、ちゃんと勉強してなかったので、個人的にすっきりです。しっかり復習して身につけましょう。お疲れさまでした。
コメント