【问题标题】:Read and write Unicode character from Json file using Python使用 Python 从 Json 文件中读取和写入 Unicode 字符
【发布时间】:2017-09-07 19:58:25
【问题描述】:

我正在尝试使用附加的 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":"£"
    }]
}

【问题讨论】:

    标签: json python-3.x unicode character-encoding


    【解决方案1】:

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

    当您使用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),但我不建议这样做)。

    【讨论】:

    • 谢谢@lenz,是的,我就是这么做的,现在它可以工作了。另一方面,我是 Unix 环境的新手。我认为在 Win env 中构建和测试的源代码仍然可以在 Unix env 中使用,前提是使用相同的 Python 版本。对于文件路径或位置,我使用的是像 join(sourceLoc, file) 这样的 os 包,希望我的理解很好。对于 windows 路径可以是 c:\filelocation 而在 Unix 中可以是 /var/sp/filelocation/ 在 unix 上围绕 Python 的任何文档\材料都会有所帮助。
    • @RintG 我不确定我是否理解。如果您尝试编写可跨操作系统移植的代码,有几件事需要注意,并且使用os.path.join 编写路径当然是一个不错的选择。如果您对 Unix 上的 Python 有更具体的问题,请发表一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多