使用Python将JSON数据漂亮地打印到文件中


111

用于类的项目涉及解析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)

我会给您我正在使用的数据,但是它非常大,您已经看到了我用来制作文件的代码。


1
我怀疑您是否真的想写二进制数据(“ wb”)
Hamish 2012年

我被告知这对于Windows机器是必需的,到目前为止,我已经完成了所有任务。如果您可以提供有关为什么这可能不正确的文档,我很乐意进行查看。
Zelbinian '02

仅当您使用二进制文件或其他特定行尾形式(例如\r\nvs \n)很重要的情况下才需要这样做。参见stackoverflow.com/questions/3257869/…。在您的情况下,您希望使用Windows友好的行尾,但是您可能无法从twitter终结点得到它,因此您应该以文本模式打开。
Hamish

这回答了你的问题了吗?如何打印JSON文件?
wesinat0r

Answers:


102

您应该使用可选参数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()

1
谢谢,效果很好。您能解释一下为什么需要在其中输入“ sort_keys”吗?
Zelbinian'2

1
它不需要在那里,但是它使事情变得非常漂亮并且按字母顺序排序。当我想要人类可读的输出时,我倾向于使用它。
mattbornski

4
很好的解释了谢谢-但是,不鼓励不要使用&$&#而是鼓励打开/关闭来写文件,通常最好使用with结构:with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) 优点是您确定文件将关闭,例如在较大的代码段上...
logicOnAbstractions '16

with语法绝对更好,但是我尝试将自己的答案扩大到我的听众
mattbornski

73

您可以解析JSON,然后使用缩进再次将其输出,如下所示:

import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)

有关更多信息,请参见http://docs.python.org/library/json.html


@Zelbinian:是的,它在这里的工作作为simplejson一个well.Take看simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/...
RanRag

这将导致一个空文件。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 '02

5
@Zelbinian- json.dumps返回一个字符串。json.dump写入文件。
dkamins 2012年

65
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()。它也更快。


14

您可以使用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'2

@Zelbinian:确切的意思是doesn't work as well。?
RanRag

1
它以看起来像Python dict语法而不是漂亮印刷的Json语法的单行输出数据
Zelbinian 2012年

在您的问题中包括输出作为编辑。因此,我们可以看到它。
RanRag

使用此方法,数组中列出的每个值的行数最多,因此最好将数组保持在一行上。
scape

4

如果您已经具有想要格式化的JSON文件,则可以使用以下命令:

    with open('twitterdata.json', 'r+') as f:
        data = json.load(f)
        f.seek(0)
        json.dump(data, f, indent=4)
        f.truncate()

3

如果要生成新的* .json或修改现有的josn文件,请使用“ indent”参数获取漂亮的json格式。

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)

1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  

尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以改善其长期价值。

-2

您可以将文件重定向到python并使用该工具打开,并使用更多内容来读取它。

示例代码将是,

cat filename.json | python -m json.tool | more
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.