こんにちは。
今回はopen関数をpythonで利用した際にcloseするのを忘れ、問題がずーーっと解決できなかったことを共有します。
Table of Contents
open関数とは
open関数とは、新規ファイルの作成、書き込み、読み込み、追記、保存作業ができる関数です。
そして基本的にopen関数を利用するとcloseを使って閉じないといけないんですね。
しかし僕はそれを忘れていて、思っている処理に全くならなずに泥沼へはまっていました。
↓参考
Pythonのopen関数でファイル操作の基本(作成、書込、保存)
何をしようとしていたのか。
今回はあるcsvファイルを加工する作業をpythonで行っていました。
そして最終的に加工したファイルをAWSのs3にアップロードをさせようとしていたわけです。
↓流れ
csv→pythonで加工→ローカルtsvにいったん出力→s3にアップロード
そしてここで問題が発生したんですね。
何が問題だったのか。
今回データを加工する際にopen関数を使いました。
pythonを使ったことも今回の加工作業で初めてでしたので全然知らなかったのですが、open関数を使用するとcloseするのが当たり前だそうですね。
今回はそのcloseをするのを忘れて問題が発生していました。
基本的にopnenとcloseはセットで利用します。
f = open('file_name')
#fに対する操作
f.close()
↓参考
Pythonのcloseメソッドの使い方を現役エンジニアが解説【初心者向け】
今回は加工したファイルを一度ローカルのtsvファイルとして出力して、その出力したtsvファイルをs3にアップロードしようとしていたんです。
しかし、ローカルのtsvとs3にアップロードしたtsvの結果が違うんですよ。
diffで差異を確認してみると、本来は存在するはずの数レコードがs3のtsvになくなっている。
そんな問題が発生しました。ローカルtsvにはあるけど、s3のtsvには無いという怪奇現象がおきたわけです。
結局問題は自分で解決はできていなかったので先輩に確認したところ、さらっとcloseしてないんじゃない?といわれcloseすると問題が解決しました。
はははは…
closeを忘れるとどうなるのか。
最終的にプログラムを終了する際には自動でcloseしてくれるそうですが、openをほおっておくと、
- 開いたままなのでリソースを食ってしまう。
- 異常終了した際に書き込んだデータが消失する場合がある。
- 書き込み内容が反映されない。
等の不具合の元となる為openをするとcloseするのを忘れてはいけないというわけですね。
こんな記事が載っていました↓
Pythonでopenしたものは必ずcloseの必要がありますか?
まとめ
開いたら閉じる。
生活でもよく言われることがプログラムにも出てしまいました。知らないものを使うときは使っても良いけど、使い方も確認しないといけませんね。