【问题标题】:python code open(encoding='utf8') is not workingpython代码打开(编码='utf8')不起作用
【发布时间】:2022-01-12 06:58:42
【问题描述】:

我有一个 json 文件,我想在不显示为 unicode 的情况下打开(读取和写入)它们:

json 文件如下:

{"A":"\u0e16"}
{"B":"\u0e39"}
{"C":"\u0e43\u0e08\u0e27"}

我尝试了下面的代码,但没有工作(仍然以编码的 unicode 打开):

with open("test.json",encoding='utf8') as in_data:
    for line in in_data:
        print(line)

预期输出:

{"A":"ณ"}
{"B":"คุ"}
{"C":"ของ"}

【问题讨论】:

  • 您的输入文件未编码为 UTF-8。或许是这样,但"\u0e16\" 只是一组 9 个字符:"、\、u、0、e、1、6、\ 和 "。
  • 我编辑了最后一个 \" 但我认为它仍然无法正常工作
  • @9769953 ASCII 是 UTF-8 的子集,因此所有 ASCII 文件都是有效的 UTF-8。
  • 关于print 的警告。 print 可能不理解 Unicode(在 2021 年,它在 Windows 中很常见)。因此,您应该在开头添加一个print('{"A TEST":"ณ"}'),以确保您不会同时遇到两个问题(因此交互且难以调试)

标签: python json unicode


【解决方案1】:

在处理 json 文件时,您必须在使用前对其进行解码: 第一个import json 那么:

with open("jason.json", encoding="utf-8") as in_data:
    dict_from_json = json.load(in_data)
    for k, v in dict_from_json.items():
        print(k, v)

另外,您可以将 for 循环放在 with open 块之外

如果你想按原样解码,你的json文件也有错误,应该这样写:

{"A":"\u0e16 ",
"B":"\u0e39",
"C":"\u0e43\u0e08\u0e27"}

正如您在此处看到的,json 文件必须是类字典对象或列表,您可以在文档中了解更多信息

【讨论】:

  • “你可以将for循环放在with open块之外”:这意味着在for循环的每次迭代中打开和关闭文件,这是低效的。
  • @9769953 该文件被读取一次,然后存储在变量中:dict_from_json。然后 for 循环将遍历字典。它不读取文件,因此当它存储在此变量中时,您就可以有效地完成它。
  • 对不起,读错了:我把它读作将 for 循环放在 with open 块周围。不作为它下面的单独块。
【解决方案2】:

该文件不是有效的 JSON,而是所谓的“JSON 行格式”,其中每一行都是有效的 JSON。您还需要解码 JSON 行以正确显示它。 json.loads() 函数接受一个字符串并将其解码为 JSON:

import json

with open("test.json",encoding='utf8') as in_data:
    for line in in_data:
        print(json.loads(line))

输出:

{'A': 'ถ'}
{'B': 'ู'}
{'C': 'ใจว'}

【讨论】:

    【解决方案3】:

    您打开了文件但没有阅读它。 要读取文件,您必须添加

    lines=in_data.readlines()
    

    之后你就可以写了

    for line in lines:
        print(line)
    

    还有它的 utf-8

    【讨论】:

    • for line in in_data 逐行读取文件。
    • “utf-8”和“utf8”都可以。
    • 请在提出答案之前测试您的代码
    【解决方案4】:

    这只是一个小错误,而不是 encoding='utf8' 你必须使用 encoding='utf-8'

    希望它能解决问题。

    【讨论】:

    • “utf8”是“utf-8”支持的别名,请参阅docs
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 2014-06-30
    • 2011-02-22
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多