Довольно печатать данные JSON в файл с помощью Python


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")
Хэмиш

Меня учили, что это необходимо для компьютеров с Windows, и до сих пор он работал для всех моих заданий. Если вы можете предложить документацию о том, почему это может быть неверно, я был бы счастлив взглянуть на нее.
Zelbinian

Это необходимо только в том случае, если вы работаете с двоичными файлами или в других случаях, когда важна конкретная форма окончания строки (например, \r\nvs \n). См. Stackoverflow.com/questions/3257869/… . В вашем случае вам нужны окончания строк, дружественные к Windows, но вы можете не получить этого из конечной точки Twitter, поэтому вам следует открывать в текстовом режиме.
Хэмиш,

Отвечает ли это на ваш вопрос? Как распечатать файл JSON?
wesinat0r

Ответы:


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

1
Это не обязательно, но делает вещи очень красивыми и отсортированными по алфавиту. Я обычно использую его, когда хочу, чтобы результат был удобочитаемым.
mattbornski

4
Хорошо объяснено, спасибо - но не пытайтесь быть & $ & #, но открывать / закрывать для записи файла не рекомендуется, структура with обычно предпочтительнее: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) преимущество в том, что вы уверены, что файл закроется, скажем, на больших фрагментах ...
logicOnAbstractions

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. Взгляните сюда 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

5
@Zelbinian - json.dumpsвозвращает строку. json.dumpпишет в файл.
dkamins 07

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

Вы можете использовать json- модуль Python для красивой печати.

>>> 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

@Zelbinian: Exactky, что вы имеете в виду doesn't work as well?
RanRag

1
Он выводил данные в одной строке в том, что выглядело как синтаксис Python dict вместо красивого синтаксиса
Json

Включите вывод в свой вопрос как правку, чтобы мы могли его увидеть.
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()  

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность.
Tân

-2

Вы можете перенаправить файл на python и открыть его с помощью инструмента, а для чтения использовать больше.

Пример кода будет,

cat filename.json | python -m json.tool | more
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.