研究成果を一瞬で吹き飛ばす魔法のコマンド


こんにちは、美味しいしです。
結論だけ読みたい、という方はこちら

本当にあった怖い話

最近は卒論発表の時期ですね。

研究成果を一瞬で吹き飛ばす素敵なコマンドとして悪名高いのは

rm -rf hoge

ですよね。
ディレクトリごと全てを抹消できます。
あまりに有名すぎるこのコマンドを誤って使うことは、そんなにないでしょう。(たまに本番環境でやらかしちゃった人 advent calenderなどで目にしますが)

では、以下のpythonのコードはどうでしょう?

import json

nanika = json.load(open("hoge.json","w"))
print(nanika)

一見なんの害もない、ただのデータの確認のように思えますよね。
このコードを実行してみましょう。
すると、なぜかエラーがでる。

io.UnsupportedOperation: not readable

何かtypoでしょうか。
フォルダを確認してみるとと、データがぎっしり詰まっていたはずのhoge.jsonが空になっています。
おかしい.......

なぜこのようなことが起きたのでしょう...?

そう全てこいつが悪いんです。

はい、ということで今回のまとめです。

まとめ

python3において、

open(path,"w")

は、ファイルの新規作成を意味します。
すでにファイルが存在しても関係ありません。全てまっさら白無垢な状態で上書きです。

データを無に帰さないためにも、file ioを行う際にはくれぐれも注意しましょう。

対策

def json_load(path):
    json.load(open(path,"r"))
def json_dump(obj,path):
    json.dump(open(path,"w"))

def pickle_load(path):
    return pickle.load(open(path,"rb"))
def pickle_dump(obj,path):
    return pickle.dump(obj,open(path,"wb"))

あたりを作っておいて、直接ファイルioをしないようにするのも良さそうです。
みなさんも何か対策なさっていたらコメント等で教えてください。