как упорядочить первую строку текстового файла как ключ, следующую строку как значение и строку после этого как второе значение до пустой строки, затем повторить снова

#python #python-3.x

#python #python-3.x

Вопрос:

программирование новичка здесь.

У меня есть файл cars.text, разделенный строками, которые мне нужно преобразовать в словарь, и вот формат текстового файла (пожалуйста, обратите внимание, что между каждой записью автомобиля, между названием автомобиля и предыдущей строкой есть пустая строка):

 Honda

10/11/2010

blue

strong and sturdy

breaks down occasionally
    

Toyota

20/15/2005

indigo

big and spacious


Maserati

10/10/2009

silver

fast and furious

expensive to maintain

accident prone
  

Вот что я сделал

 cars={}
with open('cars.txt', 'r') as f:
  for line in f.readlines():
    car_name=line[0]
    car_date=datetime.line[1]
    car_info=line[2:]
    print(line)
    
f.close()
  

но код постоянно возвращает синтаксическую ошибку
Что я пытаюсь сделать, это сделать первую строку каждого абзаца ключом, вторую строку первым значением в формате DateTime, а третью строку до следующей пустой строки вторым значением, например:

 cars={'Honda':['10/11/2010','''blue
strong and sturdy
breaks down occasionally'''],'Toyota':['20/15/2005','''indigo
 big and spacious'''],'Maserati':['10/10/2009','''silver
fast and furious
expensive to maintain
accident prone''']
  

Комментарии:

1. Вам не нужно f.close() , потому что вы открываете файл с помощью диспетчера контекста

2. Все ли строки разделены пустой строкой? И затем у вас есть дополнительная пустая строка перед каждой новой машиной?

3. между каждым новым автомобилем есть только пустая строка 🙂

4. что-то вроде абзацев, я думаю

Ответ №1:

Вот что вам нужно. Сначала прочитайте файл и используйте splitlines() метод, чтобы составить список всех строк. Затем превратите этот список в список списков, где каждый подсписок содержит один абзац.

 with open('cars.txt') as f:
    names = f.read().splitlines()

l = []
s = []
for i in names:
    if i == "":
        l.append(s)
        s = []
    else:
        s.append(i)
l.append(s)
  

Вывод будет выглядеть следующим образом:

 [['Honda', '10/11/2010', 'blue', 'strong and sturdy', 'breaks down occasionally'], ['Toyota', '20/15/2005', 'indigo', 'big and spacious'], ['Maserati', '10/10/2009', 'silver', 'fast and furious', 'expensive to maintain', 'accident prone']]
  

Затем вы можете просто поместить эти данные в свой cars словарь.

 cars = {}
for data in l:
    car_name = data[0]
    car_date = data[1]
    car_info = 'n'.join(data[2:])
    cars[car_name] = [car_date, car_info]

print(cars)
  

Комментарии:

1. ты мой герой

Ответ №2:

Вы также можете сделать это таким образом:

Сначала удалите все пустые строки

 with open('filename', 'r ') as fd:
    lines = fd.readlines()
    fd.seek(0)
    fd.writelines(line for line in lines if line.strip())
    fd.truncate()
  

Затем выполните итерацию по строкам, по пять строк за раз

 cars={}
with open('filename', 'r') as f:
    lines = [line.rstrip() for line in f]
    for i in range(0,len(lines)-1,5):
        cars[lines[i]] = lines[i 1:i 4]
    
print (cars)