使用 Python 将 JSON 数据漂亮地打印到文件中
Posted
技术标签:
【中文标题】使用 Python 将 JSON 数据漂亮地打印到文件中【英文标题】:Pretty-Print JSON Data to a File using Python 【发布时间】:2012-02-28 12:41:17 【问题描述】:一个类项目涉及解析 Twitter JSON 数据。我正在轻松获取数据并将其设置到文件中,但这一切都在一行中。这对于我正在尝试执行的数据操作来说很好,但是该文件非常难以阅读,我无法很好地检查它,这使得为数据操作部分编写代码非常困难。
有谁知道如何在 Python 中做到这一点(即不使用命令行工具,我无法开始工作)?到目前为止,这是我的代码:
header, output = client.request(twitterRequest, method="GET", body=None,
headers=None, force_auth_header=True)
# now write output to a file
twitterDataFile = open("twitterData.json", "wb")
# magic happens here to make it pretty-printed
twitterDataFile.write(output)
twitterDataFile.close()
注意我很感谢人们向我指出 simplejson 文档等,但正如我所说,我已经看过并继续需要帮助。一个真正有用的回复将比那里找到的示例更详细和解释性更强。 谢谢
还有: 在 Windows 命令行中尝试:
more twitterData.json | python -mjson.tool > twitterData-pretty.json
结果:
Invalid control character at: line 1 column 65535 (char 65535)
我会给你我正在使用的数据,但它非常大,你已经看到了我用来制作文件的代码。
【问题讨论】:
我怀疑你真的想写二进制数据(“wb”) 我被告知这是 Windows 机器所必需的,到目前为止,我的所有作业都有效。如果您能提供文档说明为什么这可能不正确,我很乐意查看。 只有在处理二进制文件或其他特定行尾形式(例如\r\n
vs \n
)很重要的情况下才需要。见***.com/questions/3257869/…。在您的情况下,您需要 Windows 友好的行尾,但您可能无法从 twitter 端点获得,因此您应该以文本模式打开。
这能回答你的问题吗? How to prettyprint a JSON file?
【参考方案1】:
您应该使用可选参数indent
。
header, output = client.request(twitterRequest, method="GET", body=None,
headers=None, force_auth_header=True)
# now write output to a file
twitterDataFile = open("twitterData.json", "w")
# magic happens here to make it pretty-printed
twitterDataFile.write(simplejson.dumps(simplejson.loads(output), indent=4, sort_keys=True))
twitterDataFile.close()
【讨论】:
谢谢你,这完美。你能解释一下为什么“sort_keys”需要在里面吗? 它不需要在那里,但它使事情变得非常漂亮并按字母顺序排序。当我想要人类可读的输出时,我倾向于使用它。 很好地解释了谢谢 - 但是不鼓励 &$ 但不鼓励打开/关闭写入文件,with 结构通常更可取:with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var)
优势是你确保文件将关闭,例如在更大的 sn-ps 上...
with
语法肯定更好,但我尝试将我的答案扩展到我的听众【参考方案2】:
您可以解析 JSON,然后使用如下缩进再次输出:
import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)
请参阅http://docs.python.org/library/json.html 了解更多信息。
【讨论】:
@Zelbinian:是的,它也适用于 simplejson。看看这里simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/… 这会产生一个空文件。header, output = client.request(twitterRequest, method="GET", body=None, headers=None, force_auth_header=True) twitterDataFile = open("twitterData.json", "wb") json.dumps(json.loads(output), twitterDataFile, indent=4) twitterDataFile.close()
@Zelbinian - json.dumps
返回一个字符串。 json.dump
写入文件。【参考方案3】:
import json
with open("twitterdata.json", "w") as twitter_data_file:
json.dump(output, twitter_data_file, indent=4, sort_keys=True)
如果您不想稍后解析字符串,则不需要json.dumps()
,只需使用json.dump()
。它也更快。
【讨论】:
【参考方案4】:您可以使用python的json模块进行漂亮的打印。
>>> import json
>>> print json.dumps('4': 5, '6': 7, sort_keys=True, indent=4)
"4": 5,
"6": 7
所以,在你的情况下
>>> print json.dumps(json_output, indent=4)
【讨论】:
尝试了那条路线,但不幸的是它并没有你想象的那么好。 @Zelbinian:你说的doesn't work as well
是什么意思?
它以单行输出数据,看起来是 Python dict 语法,而不是漂亮的 Json 语法
在你的问题中包含输出作为编辑。所以,我们可以看到它。
使用这个,数组被列为每个值的多行,最好将数组保持在一行。【参考方案5】:
如果您正在生成新的 *.json 或修改现有的 josn 文件,请使用“缩进”参数来获取漂亮的视图 json 格式。
import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:
json.dump(responseData, twitterDataFile, indent=4)
【讨论】:
【参考方案6】:如果您已经有现有的 JSON 文件想要漂亮地格式化,您可以使用这个:
with open('twitterdata.json', 'r+') as f:
data = json.load(f)
f.seek(0)
json.dump(data, f, indent=4)
f.truncate()
【讨论】:
【参考方案7】:import json
def writeToFile(logData, fileName, openOption="w"):
file = open(fileName, openOption)
file.write(json.dumps(json.loads(logData), indent=4))
file.close()
【讨论】:
虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的附加上下文可提高其长期价值.【参考方案8】:您可以将文件重定向到 python 并使用该工具打开并使用更多来阅读它。
示例代码将是,
cat filename.json | python -m json.tool | more
【讨论】:
以上是关于使用 Python 将 JSON 数据漂亮地打印到文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何以 json 格式(双引号)漂亮地打印(人类可读的打印)Python dict? [复制]