我正在尝试使用附加的Python代码(Python V3.5.1)阅读下面的json数据,但问题 字符表示ç为Ã和£为££。 请帮助我使用能够正确读取和写入文件数据的代码,而无需更改格式或字符集
Json数据:
{
"config":[{
"filetype": ".csv",
"coldelimiter":"ç",
"rowdelimiter":"£"
}]
}
Python代码:
import json
import os
fileLoc=os.path.join(os.getcwd(),"appconfig.json")
json_data=open(fileLoc).read()
print(json_data)
输出:
{
"config":[{
"filetype": ".csv",
"coldelimiter":"ç",
"rowdelimiter":"£"
}]
}
答案 0 :(得分:0)
尽量避免隐式编码和解码。
当您使用open()
读取(或写入)文本文件(例如JSON,但与XML不同)时,文件内容将使用某些默认编码进行解码。
使用哪种默认编码取决于您的环境;你可以用locale.getpreferredencoding()
看到这个。
因此,我们假设 appconfig.json 存储在具有UTF-8的磁盘上,但您的语言环境配置为使用Latin-1,那么字母ç将是被误解为序列ç。确认:
>>> 'ç'.encode('utf8').decode('latin1')
'ç'
如果是这种情况,那么很容易修复:在open()
上指定编码:
with open(fileLoc, 'r', encoding='utf8') as f:
json_data = f.read()
还有另一种可能(但不太可能)的解释:也许默认编码已经是UTF-8,因此从文件中读取时数据会被正确解码。
然后,print()
表达式再次使用UTF-8对数据进行编码,从而向STDOUT发送一个字节序列,该序列与文件内容完全相同。
但是,您的终端(或用于执行脚本的任何内容)将输出误解为输出为Latin-1,这样它们就会显示为乱码。
如果是后者,则需要修复终端配置(接受UTF-8),或重新编码sys.stdout
(sys.stdout = codecs.getwriter('latin-1')(sys.stdout)
,但我不建议)。