LoginSignup
1
0

More than 5 years have passed since last update.

pickleやjsonで日本語をそのままファイル出力したい

Last updated at Posted at 2019-01-14

pythonにおいてjsonデータや各変数の外部出力・保存には標準モジュールのpickleやjsonが用意されていますが、日本語などの表示は以下のようになります。

data = {'ar': 'عربى', 'en': 'english', 'jp': '日本語', 'ko': '한국어'}
import pickle
with open('data.txt', 'wb') as f:
    pickle.dump(data, f)
$ cat data.txt
{"ar": "\u0639\u0631\u0628\u0649", "en": "english", "jp": "\u65e5\u672c\u8a9e", "ko": "\ud55c\uad6d\uc5b4"}

jsonの場合は

data = {'ar': 'عربى', 'en': 'english', 'jp': '日本語', 'ko': '한국어'}
import json
with open('data.txt', 'w') as f:
    json.dump(data, f)
$ cat data.txt
▒}q(XarqعربىqXenqXenglishqXjpqX 日本語qXkoqX    한국어u.

これらは本来のロードして再利用という用途に問題はありませんが、ファイル単位でサクッと確認できないのが難点です。
追記:$ python -m pickle data.txtで覗けます。LouiS0616様より

個人的には毎回手間だったので、モジュールを作りました。 pip install ppickleでインストールできます。

data = {'ar': 'عربى', 'en': 'english', 'jp': '日本語', 'ko': '한국어'}
import ppickle
ppickle.dump('data.txt', data) # 保存
loaded = ppickle.load('data.txt') # 呼び出し
print(loaded['jp']) # 日本語
print(loaded == data) # True
$ cat data.txt
{'ar': 'عربى', 'en': 'english', 'jp': '日本語', 'ko': '한국어'}

このように見た目通りがそのままファイルに保存されるようになります。

コア機能はcodecs、pprint、astを組み合わた9行で再現できます。pipの方は、loadできない形は書き出す時点で弾いたり、受け入れ可能な型を増やりと洗練したいと思っています。

ppickle.py
import codecs
import ast
from pprint import pformat

def dump(filename, data):
    with codecs.open(filename, 'w', 'utf-8') as f:
        f.write(stringed_data)

def load(filename):
    with codecs.open(filename, 'r', 'utf-8') as f:
        return ast.literal_eval(f.read())

現状listやdictしか受け入れられませんが、確認用に書き出す・ログ出力する際は中身がintがstrか空白あるかなどの確認できるよう元々リストで囲ってから出していたので、個人的には必要十分です。以上です。(絶対車輪の再開発だと思いますが、見つけられませんでした)

1
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0