使用 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? [复制]

漂亮的打印 JSON python

使用 JavaScript 漂亮地打印 JSON

使用 JavaScript 漂亮地打印 JSON

如何让 Python 的 ElementTree 漂亮地打印到 XML 文件?

漂亮的打印json,但将内部数组保留在一行python