Досить роздрукувати дані 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, і до цього часу я працював на всі мої завдання. Якщо ви можете запропонувати документацію, чому це може бути неправильним, я з радістю перегляну його.
Зельбініан

Це необхідно лише в тому випадку, якщо ви працюєте з бінарними файлами або іншими випадками, коли важлива конкретна форма закінчення рядка (наприклад, \r\nvs \n). Дивіться stackoverflow.com/questions/3257869/… . У вашому випадку ви хочете закінчувати вірогідні закінчення рядків, але ви не можете отримати це з кінцевої точки щебетання, тому вам слід відкрити в текстовому режимі.
Гаміш

Чи відповідає це на ваше запитання? Як красиво надрукувати файл 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" має бути там?
Зельбініан

1
Це не повинно бути там, але це робить речі дуже гарними та алфавітно відсортованими. Я схильний використовувати його тоді, коли хочу отримати доступний для людини результат.
mattbornski

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

withсинтаксис, безумовно, приємніший, але я намагаюся масштабувати свої відповіді перед моєю аудиторією
матборнскій

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()
Зельбініан

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

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: Exactky, що ти маєш на увазі під собою doesn't work as well.?
RanRag

1
Він виводив дані в один рядок у тому, що виглядало синтаксисом
дикта

Включіть висновок у запитання як редагування. Отже, ми можемо це побачити.
RanRag

використовуючи це, масиви перераховують стільки рядків кожного значення, було б непогано тримати масив на одному рядку.
скап

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.