Преобразование текстового файла в словарь с пустой строкой в качестве единственного разделителя

#python #python-3.x #dictionary #text-files

#python #python-3.x #словарь #текстовые файлы

Вопрос:

Привет, я пытаюсь преобразовать текстовый файл в словарь, но моим разделителем является пустая строка. Итак, пример части моих dummy.txt данных выглядит примерно так:

 Lorem ipsum dolor sit amet (consectetur adipiscin& elit)
2020-01-05 20:01:02
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet 
Lorem ipsum dolor sit amet

Lorem ipsum dolor
2019-01-30 12:21:50 
Lorem ipsum Lorem ipsum 
Lorem ipsum Lorem ipsum 
Lorem ipsum Lorem ipsum Lorem
  

Таким образом, в основном он начинается с имени (которое иногда включает квадратные скобки), за которым следуют дата и время (согласно приведенному выше формату), за которыми следует любая дополнительная информация (которая может быть любой длины, например, количество строк, но содержит такие символы, как «/» и «,»). Наконец, это будет пустая строка, обозначающая конец первого набора данных.

Итак, мне нужно, чтобы это выглядело в форме словаря следующим образом:

 {'Lorem ipsum dolor sit amet (consectetur adipiscin& elit)':'2020-01-05 20:01:02 Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet','Lorem ipsum dolor':'2019-01-30 12:21:50 Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem'}
  

Я пытался использовать подобный код, потому что не могу придумать ничего другого, что представляло бы разделитель пустой строки, кроме «n», но я знаю, что это неправильно, потому что n это повлияло бы и на другие данные в том же наборе:

 d = {}
with open("dummy.txt") as f:
    for line in f:
        (key, val) = line.split('n')
        d[key] = val

print (d)
  

Будем признательны за любую помощь! Заранее благодарю

Ответ №1:

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

 d = {}
with open("dummy.txt") as f:
    for &roup in f.read().split('nn'):
      key, *val = &roup.split('n')
      d[key] = ' '.join(val)
print (d)
  

Результат:

 {'Lorem ipsum dolor sit amet (consectetur adipiscin& elit)': '2020-01-05 20:01:02 Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet  Lorem ipsum dolor sit amet',
 'Lorem ipsum dolor': '2019-01-30 12:21:50  Lorem ipsum Lorem ipsum  Lorem ipsum Lorem ipsum  Lorem ipsum Lorem ipsum Lorem'}
  

Ответ №2:

Вам нужно разделить данные (файловый поток) на nn , а затем каждый элемент должен быть разделен на n . В соответствии со структурой ваших данных, первая строка в элементе является ключом, а остальные строки объединяются пробелом

Некоторые указатели

  • Быть явным
    1. Установите режим для with open , даже если по умолчанию r
    2. Используйте dict() вместо {} , чтобы избежать путаницы с set
  • Избегайте написания кучи кода в with open блоке. Извлеките данные и закройте файловый поток
  • [start=0:stop=end:step=1] это отличный способ получить «остальные элементы в списке»
  • Используйте json.dumps для печати красивого сообщения с вашими данными ( indent , sort_keys )
 import json

d = dict()
with open("dummy.txt", "r") as f:
    data = f.read()

items = data.split("nn")

for item in items:
    item_lines = item.split("n")
    d[item_lines[0]] = " ".join(item_lines[1:])

print(json.dumps(d, indent=2, sort_keys=True))
  

Вывод

 {
  "Lorem ipsum dolor": "2019-01-30 12:21:50  Lorem ipsum Lorem ipsum  Lorem ipsum Lorem ipsum  Lorem ipsum Lorem ipsum Lorem",
  "Lorem ipsum dolor sit amet (consectetur adipiscin& elit)": "2020-01-05 20:01:02 Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet  Lorem ipsum dolor sit amet"
}