【问题标题】:JSON Parser Python Script IssuesJSON 解析器 Python 脚本问题
【发布时间】:2018-07-05 16:12:09
【问题描述】:

我是 CS 的一年级学生,正在尝试调试一个简单的 Python 脚本。

脚本正在尝试解析 JSON 文件的目录,也就是 AWS 存储桶。但是,我无法弄清楚这些错误来自哪里:

import json
import os
from pprint import pprint

jsonDirectory = "/path/to/dir/"
targetRegion = "-insert-region-here"

print("Searching for records with AWS Region: " + targetRegion)
print("")

for filename in os.listdir(jsonDirectory):
print("Reading: " + filename)
data = json.dumps(open(jsonDirectory + filename))

for i in range(len(data["Records"])):
    if data["Records"][i]["awsRegion"] == targetRegion:
        print("---------------------------")
        print("Record #" + str(i))
        print("Username: " + data["Records"][i]["userIdentity"]    ["userName"])
        print("Event name: " + data["Records"][i]["eventName"])
        print("Event time: " + data["Records"][i]["eventTime"])
        print("---------------------------")

print("")

print("Completed reading files.")

错误:

Traceback(最近一次调用最后一次): 文件“/path/to/file.py”,第 13 行,在 数据 = json.dumps(open(jsonDirectory + 文件名)) 转储中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/init.py”,第 231 行 返回 _default_encoder.encode(obj) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py”,第 199 行,编码 块 = self.iterencode(o, _one_shot=True) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py”,第 257 行,在 iterencode 返回 _iterencode(o, 0) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py”,第 180 行,默认 o.班级.姓名) TypeError:“TextIOWrapper”类型的对象不是 JSON 可序列化的

【问题讨论】:

  • 应该使用json.load 而不是json.dumps
  • 谢谢!我仍然收到错误:“Traceback(最近一次调用最后一次):文件“/path/of/script.py”,第 13 行,在 data = json.load(open(jsonDirectory + filename)) File “/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py”,第 296 行,在加载返回加载(fp.read(),文件“/Library/Frameworks/Python. framework/Versions/3.6/lib/python3.6/codecs.py",第 321 行,在 decode (result,consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can' t 解码位置 37 中的字节 0xb0:无效起始字节"
  • 对你有用吗?
  • 对糟糕的格式表示抱歉。
  • 检查你的文件,你有一个错误,如位置 37 所示

标签: python json debugging error-handling


【解决方案1】:

假设您不在西欧或美国,默认编码不是UTF-8 或通常非常兼容的东西,例如iso-8859-1。从上面的cmets

data = json.load(open(jsonDirectory + filename))

如果您将该语句分隔为:

f = open(jsonDirectory + filename)
fdata = f.read()
data = json.loads(fdata)

您将看到错误发生在fdata = f.read()。建议是这样做:

f = open(jsonDirectory + filename, encoding='my-encoding')
fdata = f.read()
data = json.loads(fdata)

如果您不确定,请尝试强制open 忽略/绕过错误。来自 Python 文档:https://docs.python.org/3/library/functions.html#open

errors 是一个可选字符串,它指定如何处理编码和解码错误——这不能在二进制模式下使用。有多种标准错误处理程序可用(列在错误处理程序下),但任何已使用 codecs.register_error() 注册的错误处理名称也是有效的。标准名称包括:

  • 'strict' 如果存在编码错误,则引发 ValueError 异常。 None 的默认值具有相同的效果。
  • 'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。
  • “replace”会导致在存在格式错误的数据的位置插入替换标记(例如“?”)。
  • 'surrogateescape' 将在从 U+DC80 到 U+DCFF 的 Unicode Private Use Area 中将任何不正确的字节表示为代码点。当写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转换回相同的字节。这对于处理未知编码的文件很有用。
  • 'xmlcharrefreplace' 仅在写入文件时受支持。编码不支持的字符将替换为适当的 XML 字符引用 nnn;.
  • 'backslashreplace' 用 Python 的反斜杠转义序列替换格式错误的数据。
  • 'namereplace'(也仅在写入时支持)用 \N{...} 转义序列替换不受支持的字符。

ignore 开头,如:

f = open(jsonDirectory + filename, errors='ignore')
fdata = f.read()
data = json.loads(fdata)

并检查输出是否让您满意或哪里出了问题。

【讨论】:

  • 谢谢,这真的很有帮助。但是,我仍然遇到编码/解码错误。
  • 很难想象如果传递“忽略”或执行替换的选项之一(尝试errors='replace'),您可能会面临编码错误。进一步的痕迹可以为整体画面带来更多亮点。
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2020-08-19
相关资源
最近更新 更多