Куски текстов повторяются несколько раз - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть текстовый файл с содержимым, подобным приведенному ниже:

----------------------------------------
Title: Textbook
Client: ABC
----------------------------------------
----------------------------------------
Title: Comic book
Client: DEF
----------------------------------------

Мой скрипт, кажется, выводит дубликаты словарей, и я не хочу этого, но я не уверен, что не так.

data = {}
with open("sample.log", "r") as f_input:

    for line in f_input:
        if not line.startswith('----------------------------------------'):

            key, value = line.strip().split(':',1)
            data[key] = value.strip()
            print(data)

Токовый выход:

{'Title': 'Textbook', 'Client': 'ABC'}
{'Title': 'Textbook', 'Client': 'ABC'}
{'Title': 'Textbook', 'Client': 'ABC'}
{'Title': 'Comic book', 'Client': 'DEF'}
{'Title': 'Comic book', 'Client': 'DEF'}
{'Title': 'Comic book', 'Client': 'DEF'}

Ожидаемый выход:

{'Title': 'Textbook', 'Client': 'ABC'}
{'Title': 'Comic book', 'Client': 'DEF'}

1 Ответ

0 голосов
/ 10 февраля 2020

Вы печатаете все содержимое словаря data при каждом изменении любого его элементов.

Первое изменение - добавление ключа Title:Textbook. Следующее изменение добавляет Client:ABC - но поскольку вы печатаете весь словарь, вы видите оба исходный ключ Title как новый ключ Client. Это ухудшается со следующей записью для Comic book. Теперь эта строка содержит новое имя клиента, но ключ Title по-прежнему содержит неверные данные.

В начале каждой новой записи (обозначенной, по-видимому, этими ----- строками) вы должны очистить свой data. Кроме того, вы не можете хранить более одного ключа с одинаковым именем в одном словаре; Вы можете иметь только один Title и один Client. После прочтения и сохранения следующей строки для Client вы полностью перезаписали первый элемент данных новой информацией.

Чтобы избежать всего этого, создайте новый словарь и добавьте его в список вместо:

data = []
temp_dict = {}
with open("sample.log", "r") as f_input:
    for line in f_input:
        if not line.startswith('----------------------------------------'):
            key, value = line.strip().split(':',1)
            temp_dict[key] = value.strip()
        else:
            if temp_dict:
                data.append(temp_dict)
            temp_dict = {}
print(data)

с результатом, теперь список словарей:

[{'Title': 'Textbook', 'Client': 'ABC'},
 {'Title': 'Comic book', 'Client': 'DEF'}]
...