(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?
Posted
技术标签:
【中文标题】(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?【英文标题】:(discord.py) What is the correct way of checking if a message contains an element from a list?(discord.py) 检查消息是否包含列表中的元素的正确方法是什么? 【发布时间】:2020-11-07 05:48:04 【问题描述】:我正在尝试为我的机器人制作脏话过滤器。我允许服务器管理员自己列出我的机器人用于他们服务器的坏词。在on_message
函数中,我使用此代码检查用户的消息是否包含过滤器中的单词:
file = open(f"configs/antiswearvalues/customantiswear/message.guild.id.txt")
res = [ele for ele in file.read() if (ele in message.content)]
if bool(res):
await message.channel.send("you did a bad. time for the boot.")
问题是机器人仍然说you did a bad. time for the boot.
,即使消息包含来自元素而不是整个元素的sn-p。
因此,如果列表是 ['omg', 'crap', 'hell']
,如果用户的消息包含 h
或 cr
,机器人仍会警告用户,因为 hell
和 crap
包含这些。
我的问题是:如何让我的机器人正确检查用户的消息是否包含列表中的元素?
【问题讨论】:
您不应该使用返回每行列表的file.readlines()
,而不是file.read()
吗?实际上,看看这个文本文件会很有帮助。
@dantechguy 文本文件只包含列表(目前,每个不和谐服务器都有自己的文件),所以我使用哪个并不重要。文本文件实际上只是['omg', 'crap', 'hell']
那么您将需要解析该列表,因为现在file.read()
将整个文件作为字符串返回。但是您可以使用 readlines()
并更改您的文件以将每个单词放在单独的行中:omg\ncrap\nhell
您正在遍历一个字符串。不是清单。它没有看到['omg', 'crap', 'hell']
它看到"['omg', 'crap', 'hell']"
。因此,当您进行迭代时,您不会得到"omg"
、"crap"
和"hell"
。你会得到"["
、"'"
、"o"
、"m"
、...
@TinNguyen 是的,这就是问题所在。我将字符串转换为正确的列表,现在可以使用。谢谢
【参考方案1】:
您应该考虑使用json
。获取单词黑名单将比不使用任何库解析 txt 文件容易得多:
您的 json 文件(例如 blacklist.json):
['omg', 'crap', 'hell']
你的python代码:
from json import loads
@client.event
async def on_message(message):
with open("blacklist.json", "r"):
data = loads(file.read())
for word in data:
if word in message.content:
await message.channel.send("you did a bad. time for the boot.")
return
您的代码没有按预期工作,因为您没有解析文件数据,您正在探索一个字符串,而不是一个列表。
【讨论】:
请注意:如果每个列入黑名单的单词都在新行上,您还可以将文本文件解析为单列 .csv 文件。您仍然需要“导入 csv”,但对最终用户来说可能更简单。以上是关于(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章