how to decode file when writing in yaml format

Question:

I am trying to write a dictionary file that contains Tibetan language word into yaml format. Problem is i couldn’t encode/decode the file when writing the yaml file.

Here is code :

    with open('tibetan_dict.yml', 'w', encoding='utf-8') as outfile:
        yaml.dump(tibetan_dict, outfile, default_flow_style=False)

tibetan_dict contains:

{'ཀ་ཅ': '༡.་ནོར་རྫས་ཀྱི་སྤྱི་མིང་སྟེ། ཀ་ཅ་གསོག་འཇོག་ཀ་ཅས་ཚིམ་པར་བྱེད་ཅེས་པ་ལྟ་བུ།༢.འཚོ་བའི་ཡོ་བྱད་ཀྱི་སྤྱི་མིང་སྟེ། སྣོད་ཀ་ཅ་ཞེས་པ་ལྟ་བུ།', 
'ཀ་ཅི': 'རས་ཆ་ཞིག་གི་མིང་།', 
'ཀ་ཏོ་ར': 'གཞོང་བ་ལྟ་བུའི་ཟས་སྣོད་ཅིག་གི་མིང་སྟེ། }

OUTPUT i am getting :

"u0F40u0F0Bu0F45": "u0F21.u0F0Bu0F53u0F7Cu0F62u0F0Bu0F62u0FABu0F66u0F0B
  u0F40u0FB1u0F72u0F0Bu0F66u0FA4u0FB1u0F72u0F0Bu0F58u0F72u0F44u0F0Bu0F66
  u0F9Fu0F7Au0F0D u0F40u0F0Bu0F45u0F0Bu0F42u0F66u0F7Cu0F42u0F0Bu0F60u0F47
  u0F7Cu0F42u0F0Bu0F40u0F0Bu0F45u0F66u0F0Bu0F5Au0F72u0F58u0F0Bu0F54u0F62
  u0F0Bu0F56u0FB1u0F7Au0F51u0F0Bu0F45u0F7Au0F66u0F0Bu0F54u0F0Bu0F63u0F9F
  u0F0Bu0F56u0F74u0F0Du0F22.u0F60u0F5Au0F7Cu0F0Bu0F56u0F60u0F72u0F0Bu0F61
  u0F7Cu0F0Bu0F56u0FB1u0F51u0F0Bu0F40u0FB1u0F72u0F0Bu0F66u0FA4u0FB1u0F72
  u0F0Bu0F58u0F72u0F44u0F0Bu0F66u0F9Fu0F7Au0F0D u0F66u0FA3u0F7Cu0F51u0F0B
  u0F40u0F0Bu0F45u0F0Bu0F5Eu0F7Au0F66u0F0Bu0F54u0F0Bu0F63u0F9Fu0F0Bu0F56
  u0F74u0F0D"
"u0F40u0F0Bu0F45u0F72": "u0F62u0F66u0F0Bu0F46u0F0Bu0F5Eu0F72u0F42u0F0B
  u0F42u0F72u0F0Bu0F58u0F72u0F44u0F0Bu0F0D"
Asked By: lungsang

||

Answers:

If you want non-ascii characters in the yaml output, you need to pass allow_unicode=True when dumping.

>>> yaml.dump(tibetan_dict)
'"\u0F40\u0F0B\u0F45": "\u0F21.\u0F0B\u0F53\u0F7C\u0F62\u0F0B\u0F62\u0FAB\u0F66\u0F0B\n  \u0F40\u0FB1\u0F72\u0F0B\u0F66\u0FA4\u0FB1\u0F72\u0F0B\u0F58\u0F72\u0F44\u0F0B\u0F66\n  \u0F9F\u0F7A\u0F0D \u0F40\u0F0B\u0F45\u0F0B\u0F42\u0F66\u0F7C\u0F42\u0F0B\u0F60\u0F47\n  \u0F7C\u0F42\u0F0B\u0F40\u0F0B\u0F45\u0F66\u0F0B\u0F5A\u0F72\u0F58\u0F0B\u0F54\u0F62\n  \u0F0B\u0F56\u0FB1\u0F7A\u0F51\u0F0B\u0F45\u0F7A\u0F66\u0F0B\u0F54\u0F0B\u0F63\u0F9F\n  \u0F0B\u0F56\u0F74\u0F0D\u0F22.\u0F60\u0F5A\u0F7C\u0F0B\u0F56\u0F60\u0F72\u0F0B\u0F61\n  \u0F7C\u0F0B\u0F56\u0FB1\u0F51\u0F0B\u0F40\u0FB1\u0F72\u0F0B\u0F66\u0FA4\u0FB1\u0F72\n  \u0F0B\u0F58\u0F72\u0F44\u0F0B\u0F66\u0F9F\u0F7A\u0F0D \u0F66\u0FA3\u0F7C\u0F51\u0F0B\n  \u0F40\u0F0B\u0F45\u0F0B\u0F5E\u0F7A\u0F66\u0F0B\u0F54\u0F0B\u0F63\u0F9F\u0F0B\u0F56\n  \u0F74\u0F0D"n"\u0F40\u0F0B\u0F45\u0F72": "\u0F62\u0F66\u0F0B\u0F46\u0F0B\u0F5E\u0F72\u0F42\u0F0B\n  \u0F42\u0F72\u0F0B\u0F58\u0F72\u0F44\u0F0B\u0F0D"n"\u0F40\u0F0B\u0F4F\u0F7C\u0F0B\u0F62": "\u0F42\u0F5E\u0F7C\u0F44\u0F0B\u0F56\u0F0B\n  \u0F63\u0F9F\u0F0B\u0F56\u0F74\u0F60\u0F72\u0F0B\u0F5F\u0F66\u0F0B\u0F66\u0FA3\u0F7C\n  \u0F51\u0F0B\u0F45\u0F72\u0F42\u0F0B\u0F42\u0F72\u0F0B\u0F58\u0F72\u0F44\u0F0B\u0F66\n  \u0F9F\u0F7A\u0F0D "n'
>>> yaml.dump(tibetan_dict, allow_unicode=True)
"ཀ་ཅ: ༡.་ནོར་རྫས་ཀྱི་སྤྱི་མིང་སྟེ། ཀ་ཅ་གསོག་འཇོག་ཀ་ཅས་ཚིམ་པར་བྱེད་ཅེས་པ་ལྟ་བུ།༢.འཚོ་བའི་ཡོ་བྱད་ཀྱི་སྤྱི་མིང་སྟེ།n  སྣོད་ཀ་ཅ་ཞེས་པ་ལྟ་བུ།nཀ་ཅི: རས་ཆ་ཞིག་གི་མི
 ་།nཀ་ཏོ་ར: 'གཞོང་བ་ལྟ་བུའི་ཟས་སྣོད་ཅིག་གི་མིང་སྟེ། 'n"

Note that both of these are valid yaml though, and will deserialize to the same value.

Answered By: DanielB