Python: json -> текст, как писать только уникальные значения? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть файл json, из которого я извлекаю цитаты. Это файл из Kaggle (отформатированный точно так же).

Моя цель - извлечь все цитаты (только цитаты, а не авторов или другие метаданные) в простой текстовый документ , Первые 5 строк:

# Don't cry because it's over, smile because it happened.
# I'm selfish, impatient and a little insecure. I make mistakes, I am out of control and at times hard to handle. But if you can't handle me at my worst, then you sure as hell don't deserve me at my best.
# Be yourself; everyone else is already taken.
# Two things are infinite: the universe and human stupidity; and I'm not sure about the universe.
# Be who you are and say what you feel, because those who mind don't matter, and those who matter don't mind.

Проблема в том, что некоторые цитаты повторяются, и я хочу написать каждую цитату только один раз. Какой хороший способ записать только уникальные значения в текст do c?

Лучшее, что я придумал, было это:

import json

with open('quotes.json', 'r') as json_f:
    data = json.load(json_f)

    quote_list = []

    with open('quotes.txt', 'w') as text_f:
        for quote_object in data:
            quote = quote_object['Quote']
            if quote not in quote_list:
                text_f.write(f'{quote}\n')
                quote_list.append(quote)

Но кажется крайне неэффективным создавать и поддерживать отдельный список с 40 000 значений.

Я пытался чтение файла на каждой итерации функции записи, но каким-то образом чтение всегда возвращается пустым:

with open('quotes.json', 'r') as json_f:
    data = json.load(json_f)

    with open('quotes.txt', 'w+') as text_f:
        for quote_object in data:
            quote = quote_object['Quote']

            print(text_f.read()) # prints nothing?
            # if it can't read the doc, I can't check if quote already there

            text_f.write(f'{quote}\n')

Хотелось бы понять, почему text_f.read () возвращается пустым, и что является более элегантным решением.

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете использовать набор:

import json

with open('quotes.json', 'r') as json_f:
    data = json.load(json_f)

    quotes = set()

    with open('quotes.txt', 'w') as text_f:
        for quote_object in data:
            quote = quote_object['Quote']
            quotes.add(quote)

Добавление одной и той же кавычки к набору несколько раз не даст никакого эффекта: сохраняется только один объект!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...