无法读取由 json.dump()

问题描述

我正在尝试在 Python 3 中使用 StringIO 将字典列表写入 json.dump() 对象。目标是从 JSON“文件”创建一个 Pandas 数据帧,而无需实际将其保存到磁盘.我似乎无法从 StringIO 对象中读取任何内容。我的代码如下:

import json
from io import StringIO

errors = [{'dateTime': '05/06/2021,05:00PM','cs-username': '-','sc-substatus': '0','sc-win32-status': '0','sc-bytes': '34255','time-taken': '218','serverIP': '209.213.12.24','method': 'GET','file': '/ads.txt','errorMessage': "404;https://www.fudge.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'port': '443','clientIP': '66.69.69.145','userAgent': 'Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)','cookie': '-','referer': '-','statusCode': '500','errorHash': 'd5228f90df950647d0acdaa03ce5dc60b970a1ab0d8287ed611d6e3214d91667','absoluteHash': '538d59226642d818723f0f9cf1e465b9c01061daafdd79c7cbd897bceefcac1c','errorLogLine': 1,'queryParams': '-'},{'dateTime': '05/06/2021,'time-taken': '156','errorMessage': "404;https://www.crap.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'clientIP': '69.69.69.69','absoluteHash': '6763ca746c468193c53a84a4c95039e672b5592d8808b702ec3b8552b72c54eb','errorLogLine': 2,05:02PM','sc-bytes': '597','time-taken': '187','serverIP': '209.212.247.227','method': 'HEAD','file': '/https:/www.shuckydarn.com/','errorMessage': "404;https://www.fatfool.com:443/https:/www.goshdarnit.com/|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'clientIP': '72.54.211.17','userAgent': 'Test+Certificate+Info','errorHash': '2c0b5cac5730c90c5fd73f401f9196061deb59319782bf67c0f7605408fb66e0','absoluteHash': 'e7ea762b3a23ea79ce84c2f1c6fdb5ae4248fc7090a783a02735e42b70084689','errorLogLine': 3,05:03PM','sc-bytes': '34303','errorMessage': "404;https://www.supbro.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'clientIP': '54.197.11.69','userAgent': 'Mozilla/5.0+(compatible;+proximic;++http://www.proximic.com/info/spider.PHP)','absoluteHash': '495a2444a27222883e868f1c9d410b6197f04ce4be43af85f632c35113f8b351','errorLogLine': 4,'queryParams': '-'}]
fp = StringIO()
json.dump(errors,fp,indent=2)

print(fp.read())

我希望它打印出这样的东西:

[
  {
    "dateTime": "05/06/2021,05:00PM","cs-username": "-","sc-substatus": "0","sc-win32-status": "0","sc-bytes": "34255","time-taken": "218","serverIP": "209.213.12.24","method": "GET","file": "/ads.txt","errorMessage": "404;https://www.fudge.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'","port": "443","clientIP": "66.69.69.145","userAgent": "Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)","cookie": "-","referer": "-","statusCode": "500","errorHash": "d5228f90df950647d0acdaa03ce5dc60b970a1ab0d8287ed611d6e3214d91667","absoluteHash": "538d59226642d818723f0f9cf1e465b9c01061daafdd79c7cbd897bceefcac1c","errorLogLine": 1,"queryParams": "-"
  },{
    "dateTime": "05/06/2021,"time-taken": "156","errorMessage": "404;https://www.crap.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'","clientIP": "69.69.69.69","absoluteHash": "6763ca746c468193c53a84a4c95039e672b5592d8808b702ec3b8552b72c54eb","errorLogLine": 2,05:02PM","sc-bytes": "597","time-taken": "187","serverIP": "209.212.247.227","method": "HEAD","file": "/https:/www.shuckydarn.com/","errorMessage": "404;https://www.fatfool.com:443/https:/www.goshdarnit.com/|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'","clientIP": "72.54.211.17","userAgent": "Test+Certificate+Info","errorHash": "2c0b5cac5730c90c5fd73f401f9196061deb59319782bf67c0f7605408fb66e0","absoluteHash": "e7ea762b3a23ea79ce84c2f1c6fdb5ae4248fc7090a783a02735e42b70084689","errorLogLine": 3,05:03PM","sc-bytes": "34303","errorMessage": "404;https://www.supbro.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'","clientIP": "54.197.11.69","userAgent": "Mozilla/5.0+(compatible;+proximic;++http://www.proximic.com/info/spider.PHP)","absoluteHash": "495a2444a27222883e868f1c9d410b6197f04ce4be43af85f632c35113f8b351","errorLogLine": 4,"queryParams": "-"
  }
]

但它什么也不打印。为什么我无法使用 json.dump()fp.read() 读取数据?这可能是我遗漏的一些简单的东西。任何帮助表示赞赏!

解决方法

您需要使用 fp.getvalue() 而不是 read()。请注意,您的 errors 字典已经类似于 JSON,因此调用 json.dump() 会破坏输出格式

试试:

import json
from io import StringIO

errors = [{'dateTime': '05/06/2021,05:00PM','cs-username': '-','sc-substatus': '0','sc-win32-status': '0','sc-bytes': '34255','time-taken': '218','serverIP': '209.213.12.24','method': 'GET','file': '/ads.txt','errorMessage': "404;https://www.fudge.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'port': '443','clientIP': '66.69.69.145','userAgent': 'Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)','cookie': '-','referer': '-','statusCode': '500','errorHash': 'd5228f90df950647d0acdaa03ce5dc60b970a1ab0d8287ed611d6e3214d91667','absoluteHash': '538d59226642d818723f0f9cf1e465b9c01061daafdd79c7cbd897bceefcac1c','errorLogLine': 1,'queryParams': '-'},{'dateTime': '05/06/2021,'time-taken': '156','errorMessage': "404;https://www.crap.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'clientIP': '69.69.69.69','absoluteHash': '6763ca746c468193c53a84a4c95039e672b5592d8808b702ec3b8552b72c54eb','errorLogLine': 2,05:02PM','sc-bytes': '597','time-taken': '187','serverIP': '209.212.247.227','method': 'HEAD','file': '/https:/www.shuckydarn.com/','errorMessage': "404;https://www.fatfool.com:443/https:/www.goshdarnit.com/|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'clientIP': '72.54.211.17','userAgent': 'Test+Certificate+Info','errorHash': '2c0b5cac5730c90c5fd73f401f9196061deb59319782bf67c0f7605408fb66e0','absoluteHash': 'e7ea762b3a23ea79ce84c2f1c6fdb5ae4248fc7090a783a02735e42b70084689','errorLogLine': 3,05:03PM','sc-bytes': '34303','errorMessage': "404;https://www.supbro.com:443/ads.txt|49|800a01a8|Object_required:_'xmlDocTemp.documentElement'",'clientIP': '54.197.11.69','userAgent': 'Mozilla/5.0+(compatible;+proximic;++http://www.proximic.com/info/spider.php)','absoluteHash': '495a2444a27222883e868f1c9d410b6197f04ce4be43af85f632c35113f8b351','errorLogLine': 4,'queryParams': '-'}]
fp = StringIO()
json.dump(errors,fp,indent=2)

print(fp.getvalue())

输出:

'[\n  {\n    "dateTime": "05/06/2021,05:00PM",\n    "cs-username": "-",\n    "sc-substatus": "0",\n    "sc-win32-status": "0",\n    "sc-bytes": "34255",\n    "time-taken": "218",\n    "serverIP": "209.213.12.24",\n    "method": "GET",\n    "file": "/ads.txt",\n    "errorMessage": "404;https://www.fudge.com:443/ads.txt|49|800a01a8|Object_required:_\'xmlDocTemp.documentElement\'",\n    "port": "443",\n    "clientIP": "66.69.69.145",\n    "userAgent": "Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)",\n    "cookie": "-",\n    "referer": "-",\n    "statusCode": "500",\n    "errorHash": "d5228f90df950647d0acdaa03ce5dc60b970a1ab0d8287ed611d6e3214d91667",\n    "absoluteHash": "538d59226642d818723f0f9cf1e465b9c01061daafdd79c7cbd897bceefcac1c",\n    "errorLogLine": 1,\n    "queryParams": "-"\n  },\n  {\n    "dateTime": "05/06/2021,\n    "time-taken": "156",\n    "errorMessage": "404;https://www.crap.com:443/ads.txt|49|800a01a8|Object_required:_\'xmlDocTemp.documentElement\'",\n    "clientIP": "69.69.69.69",\n    "absoluteHash": "6763ca746c468193c53a84a4c95039e672b5592d8808b702ec3b8552b72c54eb",\n    "errorLogLine": 2,05:02PM",\n    "sc-bytes": "597",\n    "time-taken": "187",\n    "serverIP": "209.212.247.227",\n    "method": "HEAD",\n    "file": "/https:/www.shuckydarn.com/",\n    "errorMessage": "404;https://www.fatfool.com:443/https:/www.goshdarnit.com/|49|800a01a8|Object_required:_\'xmlDocTemp.documentElement\'",\n    "clientIP": "72.54.211.17",\n    "userAgent": "Test+Certificate+Info",\n    "errorHash": "2c0b5cac5730c90c5fd73f401f9196061deb59319782bf67c0f7605408fb66e0",\n    "absoluteHash": "e7ea762b3a23ea79ce84c2f1c6fdb5ae4248fc7090a783a02735e42b70084689",\n    "errorLogLine": 3,05:03PM",\n    "sc-bytes": "34303",\n    "errorMessage": "404;https://www.supbro.com:443/ads.txt|49|800a01a8|Object_required:_\'xmlDocTemp.documentElement\'",\n    "clientIP": "54.197.11.69",\n    "userAgent": "Mozilla/5.0+(compatible;+proximic;++http://www.proximic.com/info/spider.php)",\n    "absoluteHash": "495a2444a27222883e868f1c9d410b6197f04ce4be43af85f632c35113f8b351",\n    "errorLogLine": 4,\n    "queryParams": "-"\n  }\n]'

更新

如果您的目标是来自 dataframeerrors,请执行以下操作:

df = pd.DataFrame(errors)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...