Python: запись значений словаря JSON в файл JSON

Я пытаюсь:

  1. Загрузить данные из списка словарей JSON
  2. Записать значения определенного ключа из каждого словаря в файл

Тем не менее, когда я пытаюсь сбросить пары ключей в новый файл .json, он печатает только самую последнюю пару ключей словаря. Кто-нибудь знает, как перебрать каждый словарь и добавить пару ключей? Я пробовал несколько методов, но не могу понять, что мне не хватает и где.

Вот мой код:

with open(join(dirname(__file__),'text.json')) as tone_json:
    python_obj = json.load(tone_json)       #read file object into string
    my_list = python_obj["data"]            #assign list name to string

for dictionary in my_list:                  #loop through dictionaries in list
    for key,value in dictionary.items():    #loop through key pairs in dictionaries
        if key == "text":
            with open('comments.json', 'w') as f:
                json.dump("{}: {}".format(key,value), f)    #write key pair objects as json formatted stream to json file
                f.write('\n')

Образец моего файла JSON:

{ 
    "data": [
    {
        "text": "apple",
        "created_time": "2017-12-23",
        "comment_count": 154,
        "like_count": 856,
        "id": "1015595299xxxxx"
    },
    {
        "text": "orange",
        "created_time": "2017-12-04",
        "comment_count": 13,
        "like_count": 437,
        "id": "10155952xxxxx"
    },
    {
        "text": "grapes",
        "created_time": "2017-12-04",
        "comment_count": 12,
        "like_count": 163,
        "id": "1015595299xxxxx"
    }
    ]
}

Мой текущий результат:

"text: grapes"

Но я хочу перебрать каждый словарь и в конечном итоге распечатать только значения из каждого «текстового» ключа.

Ожидаемый результат:

"text: apple"
"text: orange"
"text: grapes"

Любые подсказки помогут! Спасибо!

Почему вы используете json.dump(), когда практически не пишете JSON? Почему бы вместо этого просто не f.write("{}: {}\n".format(key, value))? Кроме того, откройте файл в режиме a, чтобы предотвратить перезапись записей из ваших предыдущих запусков.

zwer 25.04.2018 21:19

хм, он сказал, что функция json не имеет атрибута записи. также нужен вывод в формате json для вызова отдельной функции

AWalton 25.04.2018 21:25

Не json.write(...), а f.write(...). Кроме того, хотя ваш входной файл является файлом JSON, данные, которые вы пытаетесь записать в выходной файл, наверняка не будут.

zwer 25.04.2018 21:26

а, понятно. плохо имейте это в виду. это может пригодиться позже, используя мой вызов функции

AWalton 25.04.2018 21:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
6 681
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы открыли файл в режиме w, вам нужно открыть его в a (режим добавления)

от документы:

1. 'w' только для записи (существующий файл с таким же именем будет удален)

2. 'a' открывает файл для добавления; любые данные, записанные в файл, автоматически добавляются в конец

Python 3.6.5 (default, Mar 30 2018, 06:42:10)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> my_list = [{u'created_time': u'2017-12-23', u'text': u'apple', u'comment_count': 154, u'like_count': 856, u'id': u'1015595299xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'orange', u'comment_count': 13, u'like_count': 437, u'id': u'10155952xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'grapes', u'comment_count': 12, u'like_count': 163, u'id': u'1015595299xxxxx'}]
>>> import json
>>> my_list = [{u'created_time': u'2017-12-23', u'text': u'apple', u'comment_count': 154, u'like_count': 856, u'id': u'1015595299xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'orange', u'comment_count': 13, u'like_count': 437, u'id': u'10155952xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'grapes', u'comment_count': 12, u'like_count': 163, u'id': u'1015595299xxxxx'}]
>>> for d in my_list:
...     for key, value in d.items():
...             if key == "text":
...                     with open('comments.json', 'a') as f:  # Append mode here
...                             json.dump("{}: {}".format(key,value), f)
...                             f.write('\n')
...

Содержимое comments.json,

"text: apple"
"text: orange"
"text: grapes"

Файловые режимы в Python,

'r' open for reading (default)
'w' open for writing, truncating the file first
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newlines mode (deprecated)

Если я вас правильно понял, это должно делать то, что вы хотите:

with open('comments.json', 'a') as f:
    json.dump("{}: {}".format(key,value), f)    #write key pair objects as json formatted stream to json file
    f.write('\n')

Просто измените 'w' на 'a', чтобы не перезаписывать шrite, а аppend к файлу

Тогда, пожалуйста, кроме ответа.

MegaIng 25.04.2018 21:20

Другие вопросы по теме