Python – добавить несколько значений в текстовый файл из одной переменной

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

  1. Пользователь вводит !songrequest [URL].
  2. Бот обрабатывает URL и извлекает из него название песни.
  3. Бот отправляет подтверждающее сообщение и сохраняет название песни в переменной.

Итак, из-за того, что все названия песен хранятся в одной и той же переменной, она постоянно перезаписывает себя, даже если помещается в набор. Я новичок в Python, поэтому, если бы кто-нибудь мог мне помочь и рассказать, как я могу отправить каждое уникальное название песни в набор, список и т. Д., Я был бы очень рад! Заранее спасибо!

Мой код:

if message.startswith("!songrequest"):
        request = message.split(' ')[1]
        youtube = etree.HTML(urllib.urlopen(request).read())
        video_title = youtube.xpath("//span[@id='eow-title']/@title")
        song = ''.join(video_title)
        requests = set()
        requests.add(song + "\r\n")
        sendMessage(s, song + " has been added to the queue.")
        with open("requests.txt", "w") as text_file:
            text_file.write(str(requests))
        break

Если вы найдете какие-либо другие предложения по очистке моего кода, пожалуйста, сообщите мне их ниже!


person lucap    schedule 19.02.2016    source источник
comment
Что вы собираетесь делать с текстовым файлом?   -  person tzaman    schedule 20.02.2016
comment
@tzaman Я еще не думал об этом, в основном это было бы для меня, чтобы иметь возможность читать и воспроизводить перечисленные песни, однако я мог бы попытаться найти способ взять строки в файле и автоматически воспроизвести их.   -  person lucap    schedule 20.02.2016
comment
Так почему файл вместо того, чтобы просто хранить в памяти словарь/набор/и т. д.?   -  person tzaman    schedule 20.02.2016
comment
@tzaman Это тоже возможно, текстовый файл был просто примером.   -  person lucap    schedule 20.02.2016
comment
Вам просто нужно объявить свой набор где-то более постоянным, вместо того, чтобы каждый раз создавать новый. Например, если у вас есть класс бота, вы можете сказать self.requests = set() в методе __init__, а затем сделать self.requests.add в своем коде.   -  person tzaman    schedule 20.02.2016
comment
@tzaman О, хорошо, спасибо!   -  person lucap    schedule 20.02.2016


Ответы (1)


Давайте очистим это, создав функцию:

if message.startswith("!songrequest"):
    song = message.split(' ', 1)[1]   # Add max=1 to split()
    message = request_song(song)
    sendMessage(s, message)
    break

Теперь давайте напишем функцию request_song(title). Я думаю, вы должны вести уникальный список запрошенных песен и сообщать пользователю, если песня уже запрошена. Когда вы проигрываете песню, вы можете очистить запрос (предположительно, когда вы ее проигрываете, все, кто просил ее, услышат ее и будут удовлетворены). Функция может вернуть соответствующее сообщение в зависимости от того, какое действие она предпримет.

def request_song(song:str) -> str:
    """
    Add a song to the request queue. Return a message to be sent
    in response to the request. If the song is new to the list, reply
    that the song has been added. If the song is already on the list,
    or banned, reply to that effect.
    """
    if song.startswith('http'):
        if 'youtube' not in song:
            return "Sorry, only youtube URLs are supported!"

        youtube = etree.HTML(urllib.urlopen(request).read())
        song_title = youtube.xpath("//span[@id='eow-title']/@title")
    else:
        song_title = song.strip().lower()

    with open('requests.txt') as requestfile:
        requests = set(line.strip().lower() for line in requestfile)

    if song_title in requests:
        return "That song is already in the queue. Be patient!"

    # Just append the song to the end of the file
    with open('requests.txt', 'a') as f:
        print(file=f, song_title)

    return "'{}' has been added to the queue!".format(song_title)
person aghast    schedule 19.02.2016
comment
Спасибо, однако, когда я запускаю программу, она выдает недопустимую синтаксическую ошибку в строке def request_song(song:str) -> str:, указывающую на двоеточие. Я перепробовал все, что я знаю (что немного: P), чтобы исправить это, но я не смог устранить ошибку. Любые идеи? - person lucap; 20.02.2016
comment
Если вы используете более старую версию Python, просто избавьтесь от нее: request_song(song): - person aghast; 20.02.2016