2017-04-09 66 views
2

.json文件存在问题,它包含西里尔字母符号。如何将CP1251转换为UTF-8? (temp_data.decode( 'UTF-8')没有任何影响,如在.dumps ensure_ascii =假(Python)错误的字符串值(CP1521到UTF8)

import json 

def load_data(filepath): 
    with open(filepath, 'r') as f: 
     temp_data = json.load(f) 
    return temp_data 


    def pretty_print_json(d): 
     out_json = json.dumps(d, sort_keys=True, indent=4, separators = (',', ': ')) 
     print(out_json) 

    if __name__ == '__main__': 
     print("Enter the path to .json file: ") 
     in_path = input() 
     print("There are pretty printed json format: ") 
     pretty_print_json(load_data(in_path)) 
+0

您有什么问题?显示示例数据文件,所需输出和实际输出。 –

+0

数据文件包含像“ВОД​​КА”和“БАЛАЛАЙКА”这样的俄语单词,但结果是单词被视为“/ u0439/u0440”等 –

+1

数据文件的编码是什么?用细节更新你的问题。添加**数据的**小样本,以再现问题。 –

回答

0

可以传递ensure_ascii,如果ensure_ascii为真(默认值) ,输出中的所有非ASCII字符都使用\ uXXXX序列进行转义,结果是仅由ASCII字符组成的str实例。如果ensure_ascii为false,则结果可能是Unicode实例。如果输入包含Unicode字符串或使用编码参数,通常会发生这种情况。

你的代码改成这样:

out_json = json.dumps(d, sort_keys=True, indent=4, separators = (',', ': '), ensure_ascii=False) 

而且还有一个全码:

import json 

def load_data(filepath): 
    with open(filepath, 'r') as f: 
     temp_data = json.load(f) 
    return temp_data 


def pretty_print_json(d): 
    out_json = json.dumps(d, sort_keys=True, indent=4, separators = (',', ': '), ensure_ascii=False) 
    print(out_json) 

if __name__ == '__main__': 
    print("Enter the path to .json file: ") 
    in_path = raw_input() 
    print("There are pretty printed json format: ") 
    pretty_print_json(load_data(in_path)) 

我测试this代码与此JSON文件。

您可以在asciinema中查看结果。

+0

UnicodeEncodeError:'charmap'编解码器无法在位置1328编码字符'\ xab':字符映射到

+0

哪个Python?我用Python3测试了它,并且工作了!和Python2 :)你能给我们一个你的json的样本吗? – RaminNietzsche

+0

Python 3.4 它包含西里尔文,正如我所说。可能是我的系统有问题,我不知道 –

0

This Works。提供对数据文件的样本,如果你的数据不指定编码:

#coding:utf8 
import json 

datafile_encoding = 'cp1251' # Any encoding that supports Cyrillic works. 

# Create a test file with Cyrillic symbols. 
with open('test.json','w',encoding=datafile_encoding) as f: 
    D = {'key':'АБВГДЕЖЗИЙКЛМНОПРСТ', 'key2':'АБВГДЕЖЗИЙКЛМНОПРСТ'} 
    json.dump(D,f,ensure_ascii=False) 

# specify the encoding of the data file 
def load_data(filepath): 
    with open(filepath, 'r', encoding=datafile_encoding) as f: 
     temp_data = json.load(f) 
    return temp_data 

# Use ensure_ascii=False 
def pretty_print_json(d): 
    out_json = json.dumps(d, sort_keys=True, ensure_ascii=False, indent=4, separators = (',', ': ')) 
    print(out_json) 

if __name__ == '__main__': 
    in_path = 'test.json' 
    pretty_print_json(load_data(in_path)) 
{ 
    "key": "АБВГДЕЖЗИЙКЛМНОПРСТ", 
    "key2": "АБВГДЕЖЗИЙКЛМНОПРСТ" 
}