使用Python从Json文件中读写Unicode字符

5
我将尝试使用以下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":"£"
    }]
}
1个回答

3

尽量避免隐式编码和解码。

当您使用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对数据进行编码,从而向标准输出发送一系列字节,这些字节与文件内容完全相同。但是,你的终端(或者你用来执行脚本的任何东西)将输出误解为Latin-1,以至于它们显示为乱码字符。
如果是后者,则需要修复终端配置(以接受UTF-8),或重新编码sys.stdout(使用sys.stdout = codecs.getwriter('latin-1')(sys.stdout),但我不建议这样做)。

谢谢@lenz,是的,这正是我所做的,现在它可以工作了。另外,我对Unix环境还不熟悉。我认为,在Win环境中构建和测试的源代码仍然可以在Unix环境中使用,只要使用相同的Python版本即可。对于文件路径或位置,我正在使用os包,例如join(sourceLoc, file),希望我的理解是正确的。对于Windows路径,可能是c:\filelocation,而在Unix中可能是/var/sp/filelocation/。任何关于Python在Unix上的文档或资料都将非常有帮助。 - RintG
@RintG 我不确定我理解了。如果您试图编写可在多个操作系统上移植的代码,有几件事情需要注意,并且使用 os.path.join 来编写路径绝对是一个好选择。如果您对 Unix 上 Python 有更具体的问题,请发布一个单独的问题。 - lenz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接