JSON解析器Python脚本问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON解析器Python脚本问题相关的知识,希望对你有一定的参考价值。

我是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.")

错误:

回溯(最近一次调用最后一次):文件“/path/to/file.py”,第13行,在data = json.dumps(open(jsonDirectory + filename))文件“/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/ “encode.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.class.name )TypeError:'TextIOWrapper'类型的对象不是JSON可序列化的

答案

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

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()中注册的任何错误处理名称也是有效的。标准名称包括:

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

ignore开始,如:

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

并检查输出是否满足您或出现问题。

以上是关于JSON解析器Python脚本问题的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs GraphQL 片段解析器

Python3自定义json逐层解析器

Python 解析 JSON 数组

如何将选定的微调器 id 传递给片段

Python3 解析 XML

TypeError:使用Python解析JSON时字符串索引必须是整数?