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脚本问题的主要内容,如果未能解决你的问题,请参考以下文章