как я могу получить формат yaml с вводом в python??(без использования библиотеки pyyaml)

#python #python-3.x #input #yaml #pyyaml

#python #python-3.x #входные данные #ямл #пиямл

Вопрос:

Я хочу получить данные из входных данных в формате yaml.Эти данные включают информацию о пользователе и информацию о музыкальных альбомах, которые приобрел каждый пользователь.Входная информация выглядит следующим образом:

 2 # this line specify the number of users
- name: user1
  age: 18
  city: city1
  albums:
    - album1
    - album2
    - album3
- name: user2
  age: 20
  city: city2
  albums:
    - album2
    - album1
    - alubm3
3 # this line specify the number of albums 
- name: album1
  singer: singer1
  genre: classic
  tracks: 10
- name: album2
  singer: singer2
  genre: pop
  tracks: 22
- name: album3
  singer: singer3
  genre: pop
  tracks: 14
 

Для этого я написал следующий код

 num_user = int(input())

users_data = {}
albums_data = {}

for i in range(num_user):
    name, age, city = input().split()[-1], input().split()[-1], input().split()[-1]
    input()
    albums=[]
    next_line = input()
    while next_line.split()[0]=='-' and len(next_line)-len(next_line.lstrip(' '))==4:
        albums.append(next_line.split()[-1])
        next_line = input()
    if len(next_line.split()) < 2:
        num_albums = int(next_line)
    users_data[name]=[age, city, albums]
for i in range(num_albums):
    name, singer, genre, tracks = input().split()[-1],input().split()[-1],
            input().split()[-1], input().split()[-1]
    albums_data[name]=[singer, genre, tracks]
 

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

 {'user1': ['18', 'city1', ['album1', 'album2', 'album3']], 'user2': ['20', 'city2', ['album2', 'album1', 'alubm3']]} {'album1': ['singer1', 'classic', '10'], 'album2': ['beeptunes', 'pop', '22'], 'tekunbede': ['beeptunes', 'pop', '14']}
 

но пойми это:

 {'user1': ['18', 'city1', ['album1', 'album2', 'album3']], '20': ['city2', 'albums:', ['album1', 'alubm3']]} {'album1': ['singer1', 'classic', '10'], 'album2': ['beeptunes', 'pop', '22'], 'tekunbede': ['beeptunes', 'pop', '14']}
 

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

1. Почему «без использования библиотеки pyyaml»? Правильный синтаксический анализатор, будь то PyYAML или ruamel. yaml или что-то еще — это правильное решение.

2. Потому что это практический вопрос, и его попросили не использовать библиотеку в решении @Chris

Ответ №1:

Проблема, похоже, заключается в том, что после обработки последнего альбома для первого пользователя вы снова вызываете input(), который получает имя. Отделение ввода от обработки поможет устранить проблему, поэтому посмотрите на создание функции для обработки имени после его обнаружения.

так что попробуйте:

  1. прочитайте ввод
  2. определите, что делать на основе ввода
  3. обработайте прочитанные данные
 num_user = int(input())

users_data = {}
albums_data = {}

for i in range(num_user):
    name, age, city = input().split()[-1], input().split()[-1], input().split()[-1]
    input()
    albums=[]
    next_line = input()
    while next_line.split()[0]=='-' and len(next_line)-len(next_line.lstrip(' '))==4:
        albums.append(next_line.split()[-1])
        next_line = input() # This is the line with the issue
    if len(next_line.split()) < 2:
        num_albums = int(next_line)
    users_data[name]=[age, city, albums]
for i in range(num_albums):
    name, singer, genre, tracks = input().split()[-1],input().split()[-1],
            input().split()[-1], input().split()[-1]
    albums_data[name]=[singer, genre, tracks]