2016-01-18 2 views
1

Я работаю над ботом для Discord. Дело в том, что я использую ffprobe, чтобы получить название и исполнитель всех песен внутри папки. Теперь я хочу сохранить эту информацию в файле YAML, чтобы потом получить ее позже, когда мой пользователь набирает! Playlist. Вот мой текущий код.YAML Сохранение и получение

# Music Player codes--------------- 
    if message.content.startswith('!load'.format(self.user.mention)): 
     await self.send_message(message.channel, 'Hooked to the voice channel. Please wait while' 
               ' I populate the list of songs.') 

     global player 
     global voice_stream 

     if self.is_voice_connected(): 
      await self.send_message(message.channel, 
            '```Discord API doesnt let me join multiple servers at the moment.```') 

     else: 
      voice_stream = await self.join_voice_channel(message.author.voice_channel) 

     # TODO get a better way to store local playlist 
     try: 
      ids = 0 
      global s_dict 
      s_list = [] 
      s_playlist = [] 
      a = glob.glob('./audio_library/*.mp3') 
      for a in a: 
       try: 
        b = a.replace('\\', '/') 
        ids += 1 
        s_list.append(ids) 
        s_list.append(b) 
        print(b) 
        p = sp.Popen(['ffprobe', '-v', 'quiet', '-print_format', 'json=compact=1', '-show_format', 
            b], stdout=sp.PIPE, stderr=sp.PIPE) 
        op = p.communicate() 
        op_json = json.loads(op[0].decode('utf-8')) 
        title = op_json['format']['tags']['title'] 
        artist = op_json['format']['tags']['artist'] 
        await self.send_message(message.channel, 
              title + ' - ' + artist + ' (code: **' + str(ids) + '**)') 
        s_playlist.append(ids) 
        s_playlist.append(title + ' - ' + artist) 

       except Exception as e: 
        print(str(e)) 
     except: 
      await self.send_message(message.channel, 
            '```No songs in the directory lol.```') 

     s_playlist_dict = dict(s_playlist[i:i + 2] for i in range(0, len(s_playlist), 2)) 
     with open('./configuration/playListInfo.yaml', 'w') as f2: 
      yaml.dump(s_playlist_dict, f2, default_flow_style=False) 

     s_dict = dict(s_list[i:i + 2] for i in range(0, len(s_list), 2)) 
     with open('./configuration/song_list.yaml', 'w') as f1: 
      yaml.dump(s_dict, f1, default_flow_style=False) 

Ok. Таким образом, это приводит к файлу, подобному этому.

1: A Party Song (The Walk of Shame) - All Time Low 
2: Therapy - All Time Low 
3: Barefoot Blue Jean Night - Jake Owen 

И позже, когда я пытаюсь использовать! Плейлиста, код которого

if message.content.startswith('!playlist'): 

     try: 
      # Loading configurations from config.yaml 
      with open('./configuration/playListInfo.yaml', 'r') as f3: 
       plist = yaml.load(f3) 
      idq = 1 
      print(plist[idq]) 
      plistfinal = '' 
      for plist in plist: 
       song = plist[idq] 
       plistfinal += str(song + str(idq) + '\n') 
       idq += 1 

      print(plistfinal) 

     except Exception as e: 
      await self.send_message(message.channel, 
            '```' + str(e) + '```') 

Я получаю ошибку 'INT' объект не subscriptable.

Ignoring exception in on_message 
Traceback (most recent call last): 
    File "C:\Users\dell\AppData\Local\Programs\Python\Python35-32\lib\site- packages\discord\client.py", line 254, in _run_event 
    yield from getattr(self, event)(*args, **kwargs) 
    File "C:/Users/dell/Desktop/Python Projects/lapzbot/lapzbot.py", line 198, in on_message 
song = plist[idq] 
TypeError: 'int' object is not subscriptable 

Каков наилучший способ сохранить эту информацию и получить ее позже как можно чище?

+0

* У меня есть ошибка * Какая ошибка? –

+0

Объект 'int' не подлежит расшифровке. Эта ошибка. Я обновлю его и в своем посте. Ty. – lap00zza

+0

На какой строке? .. –

ответ

1

plist одновременно название структуры данных (отображение/Dict), а также итератор для своих ключей, что не будет работать, потому что в цикле forplist будет ключевым. Лучше сделать что-то вроде следующего:

import ruamel.yaml as yaml 

yaml_str = """\ 
1: A Party Song (The Walk of Shame) - All Time Low 
2: Therapy - All Time Low 
3: Barefoot Blue Jean Night - Jake Owen 
""" 

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader) 

print(data[1]) 
print('---') 

plistfinal = '' 
for idq, plist in enumerate(data): 
    song = data[plist] 
    plistfinal += (str(song) + str(idq) + '\n') 

print(plistfinal) 

, который печатает:

A Party Song (The Walk of Shame) - All Time Low 
--- 
A Party Song (The Walk of Shame) - All Time Low0 
Therapy - All Time Low1 
Barefoot Blue Jean Night - Jake Owen2 

Я не вижу определенную проблему с использованием отображения/Dict как структура данных. Хотя если ключ для значений, всегда будет целым числом с инкрементальными значениями, вы также можете записать его как последовательность/список.

Смежные вопросы