Почему оператор if если не работает с discord.py? - PullRequest
0 голосов
/ 20 января 2020

У меня есть следующий код для бота Discord, над которым я работаю:

import discord
import random 
from discord.ext import commands, tasks
import os
import time
import asyncio
import re
import urllib.request
import json
from apiclient.discovery import build
from itertools import product, cycle
from discord.ext.tasks import loop

client = commands.Bot(command_prefix =  'v!', description='fff', case_insensitive=True)

token = 'REDEACTED'
client.remove_command("help")

@client.command(pass_context=True)
async def Ban(ctx):

    members = []

    a = (ctx.author)
    print(a)

    m = (ctx.message.content)

    m = m.replace("v!ban ", '')
    print(m)

    with open('members.txt', 'w'): pass

#    print(members)
    for member in ctx.guild.members:

        with open('members.txt', 'a', encoding = "UTF-8") as f:
            f.writelines(str(member) + '\n')

    with open('members.txt', 'r', encoding = "UTF-8") as f:
        members = f.read()

    for i in members:
        if i == m:
            print('True')
        else:
            print("False")

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')
    await client.change_presence(activity = discord.Game("v!help"))

client.run(token)

Файл members.txt содержит: (члены моего сервера Discord)

kurt#6396
galen#2172
xXDEFECTMEXx#0598
xx_kyrah.w#2995
lmao.com#5953
skyanite#1725
Gilly#5865
chef shaq#3889
mariokuhl.RS#0101
UltimateDucc#9121
xSaltyOne#9450
Jacobs Kid#0771
Alex L#7988
✪ csw ✪#0115
smithers#4004
Little5avage#8028
FaZe_Eric#9627
Unib_Rovodkalan#8661

ARX6.#5773
The Bomb#3693

Если бы я должен был выполнить команду v!ban UltimateDucc#9121, он бы возвратил False вместо True, даже если это значение присутствует в массиве.

Что я пытается достичь:

Собрать участников сервера - Готово

Поместить в файл - Готово

Получить ввод от пользователя - Готово

Проверить, есть ли ввод в файле - Застрял

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 20 января 2020

Комментарии добавлены для пояснения, но ваша основная проблема заключалась в том, что вы перебирали все символы в загруженном списке из файла и проверяли, равен ли каждый из них строке, предоставленной пользователем.

@client.command(pass_context=True)
async def Ban(ctx):

    members = []

    a = (ctx.author)
    print(a)

    m = (ctx.message.content)

    m = m.replace("v!ban ", '')
    print(m)

    with open('members.txt', 'w'): pass

    # I swapped the order here because otherwise the file gets opened each iteration
    with open('members.txt', 'a', encoding = "UTF-8") as f:
        for member in ctx.guild.members:
            f.write(str(member) + '\n') # you don't have to use writelines here because you are only writing a single line

    with open('members.txt', 'r', encoding = "UTF-8") as f:
        members = f.read().split('\n') # we want a list of members, not a string containing all of them

    # we can just use the "in" operator here, it checks if our string is in the loaded list
    if m in members:
        print('True')
    else:
        print("False")
0 голосов
/ 20 января 2020

Не используйте это:

# code block 1
for i in members:
    if i == m:
        print('True')
    else:
        print("False")

Используйте это:

# code block 2
if i in members:
    print('true')
else:
    print('false')

или

Используйте это:

# code block 3 
x = members.split('\n')
if i in members:
    print('true')
else:
    print('false')

В коде Блок 1: Сравнения выполняются посимвольно. Вы сравниваете каждый символ в файле со строкой, введенной пользователем.

В блоке кода 2: Python ищет подстроку в данной строке. ie: Возвращается значение True, если введенная пользователем строка присутствует в содержимом файла.

В блоке кода 3: Разделить содержимое файла построчно и сохранить каждую запись в массиве. Затем посмотрите, есть ли строка, введенная пользователем, в этом массиве.

0 голосов
/ 20 января 2020

f.read() вернет строку с содержимым файла.
Когда вы пропустите через него oop, i будет каждым символом в этой строке.

Вы должны использовать list(f) или f.readlines() и зачеркните новую строку в конце вместо

См. https://docs.python.org/3/tutorial/inputoutput.html#methods -of-file-objects для получения дополнительной информации.

...