如何使用python中的输入获取yaml格式??(不使用pyyaml库)
我想从yaml格式的输入中获取数据。数据包括每个用户购买的用户信息和音乐专辑信息。输入信息如下:如何使用python中的输入获取yaml格式??(不使用pyyaml库),python,python-3.x,input,yaml,pyyaml,Python,Python 3.x,Input,Yaml,Pyyaml,我想从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 - album
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']], '20': ['city2', 'albums:', ['album1', 'alubm3']]} {'album1': ['singer1', 'classic', '10'], 'album2': ['beeptunes', 'pop', '22'], 'tekunbede': ['beeptunes', 'pop', '14']}
问题似乎是,一旦您为第一个用户处理了最后一个相册,您就会再次调用input(),这将获得名称。将输入与处理分离将有助于解决问题,因此,请看一下创建一个函数,以便在检测到名称后处理名称 因此,请尝试:
num\u user=int(input())
用户_data={}
相册_数据={}
对于范围内的i(num_用户):
姓名、年龄、城市=输入().split()[-1],输入().split()[-1],输入().split()[-1]
输入()
相册=[]
下一行=输入()
而next_line.split()[0]='-'和len(next_line)-len(next_line.lstrip('')==4:
albums.append(下一行.split()[-1])
next_line=input()#这是问题所在的行
如果len(next_line.split())小于2:
num\u albums=int(下一行)
用户\u数据[姓名]=[年龄、城市、相册]
对于范围内的i(num_相册):
姓名、歌手、流派、曲目=输入().split()[-1],输入().split()[-1]\
input().split()[-1],input().split()[-1]
专辑数据[姓名]=[歌手、流派、曲目]
问题似乎是,一旦您为第一个用户处理了最后一张相册,您将再次调用input(),这将获取名称。将输入与处理分离将有助于解决问题,因此,请看一下创建一个函数,以便在检测到名称后处理名称
因此,请尝试:
num\u user=int(input())
用户_data={}
相册_数据={}
对于范围内的i(num_用户):
姓名、年龄、城市=输入().split()[-1],输入().split()[-1],输入().split()[-1]
输入()
相册=[]
下一行=输入()
而next_line.split()[0]='-'和len(next_line)-len(next_line.lstrip('')==4:
albums.append(下一行.split()[-1])
next_line=input()#这是问题所在的行
如果len(next_line.split())小于2:
num\u albums=int(下一行)
用户\u数据[姓名]=[年龄、城市、相册]
对于范围内的i(num_相册):
姓名、歌手、流派、曲目=输入().split()[-1],输入().split()[-1]\
input().split()[-1],input().split()[-1]
专辑数据[姓名]=[歌手、流派、曲目]
为什么“不使用pyyaml库”?正确的解析器,无论是PyYAML还是ruamel.yaml,都是正确的解决方案。因为这是一个实践问题,要求不要在solution@ChrisWhy中使用库“而不使用PyYAML库”?正确的解析器,无论是PyYAML还是ruamel.yaml,都是正确的解决方案。因为这是一个实践问题,要求不要在solution@Chris中使用库
{'user1': ['18', 'city1', ['album1', 'album2', 'album3']], '20': ['city2', 'albums:', ['album1', 'alubm3']]} {'album1': ['singer1', 'classic', '10'], 'album2': ['beeptunes', 'pop', '22'], 'tekunbede': ['beeptunes', 'pop', '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() # 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]