JSON解析器Python脚本问题

时间:2018-01-26 10:15:54

标签: python json debugging error-handling

我是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行,in       data = json.dumps(open(jsonDirectory + filename))     转储中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/init.py”,第231行       return _default_encoder.encode(obj)     文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py”,第199行,编码       chunks = self.iterencode(o,_ one_shot = True)     文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py”,第257行,在iterencode中       return _iterencode(o,0)     文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py”,第180行,默认情况下       O操作。的即可。的名称)   TypeError:“TextIOWrapper”类型的对象不是JSON可序列化的

1 个答案:

答案 0 :(得分:0)

我假设您不在西欧或美国,默认编码不是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忽略/绕过错误。来自:https://docs.python.org/3/library/functions.html#open

的Python文档
  

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

     
      如果存在编码错误,
  • 'strict'会引发ValueError异常。默认值None具有相同的效果。
  •   
  • '忽略'忽略错误。请注意,忽略编码错误可能会导致数据丢失。
  •   
  • '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)

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