2017-12-23 9 views
1

私のコードのいくつかの段階で、Python辞書をjsonファイルにダンプする必要があります。なお、ここでないコードである:Python json.dumpは、サイズがゼロのファイルを生成します。

def output_batch(self, batch): 
    with open(os.path.join(self.get_current_job_directory(), 'batch_' + str(self.index) + '.json'), 'w') as json_file: 
     json.dump(batch, json_file, sort_keys = True, indent = 4, separators = (',', ': ')) 
    exit() 

ここself.indexは、この特定のインスタンスを識別する一意の整数インデックスです。 self.get_current_job_directory()は、ファイルを作成するパスを返します。

ダンプする直前に辞書の長さを記録すると、42691が返されます。ただし、出力ファイルのサイズは0バイトです。これは本当に意味をなさない。空のdictの場合でも、ファイルは2バイトの長さになります({}を補うため)。

このコードは高度に並列化されたマップ・リダクション・スタイルのパイプラインの一部であり、ここではほとんど再現することはできません。このような設定では何百万もの問題が発生する可能性がありますが、dictにアクセスできるスレッドは他になく、他のスレッドは同じ出力ファイルにアクセスしません。

***アップデート:この関数呼び出しの直後にプロセスは(exit()を呼び出して終了します)、これと何か関係がありますか?

これがなぜ起こるのかについてのご意見やご提案はありますか?

+0

明白かもしれませんが、実際に印刷(json_file)して、実際に正しいファイルに書き込んでいることを再確認しましたか? – kshikama

+0

@kshikamaはい。私はそれが問題ではないことを100%確信しています。 – DarthPaghius

+0

jsonダンプを試みる直前に、 "Hello World"やそのファイルに無作為に何かを書くことができますか? – kshikama

答えて

0

withコンテキストが関数の最後に正しく終了していない可能性があります。明示的にファイルを閉じてみてください。

def output_batch(self, batch): 
    json_file = open(...): 
    json.dump(batch, json_file, sort_keys = True, indent = 4, separators = (',', ': ')) 
    json_file.close() 

はまた、あなたが書き込み権限で open('w')を呼び出し、そしてあなたがその場所への書き込み権限を持っていることを確認してください。

関連する問題