Python字符串split()方法读取IRC时导致索引错误

Posted

技术标签:

【中文标题】Python字符串split()方法读取IRC时导致索引错误【英文标题】:Python string split() method causes index error when reading IRC 【发布时间】:2019-03-26 03:28:15 【问题描述】:

我正在创建一个 twitch 聊天机器人来阅读我的信息流中的聊天内容。但是当我尝试将传入的字符串 .split() 分成单独的字符串以隔离用户名和消息时,它会显示一个额外的'和 ["'"]。当我尝试按索引单独打印字符串时,出现索引错误。

以下是连接twitch聊天的代码,以及当我在聊天中输入“test”时的结果。

from settings import *
import socket
import threading

class twitch:
    def __init__(self, host, port, nick, pwd, channel):
        self.s = socket.socket()
        self.s.connect((host, port))
        self.s.send(bytes("PASS " + pwd + "\r\n", "UTF-8"))
        self.s.send(bytes("NICK " + nick + "\r\n", "UTF-8"))
        self.s.send(bytes("JOIN #" + channel + " \r\n", "UTF-8"))
        self.s.send(bytes("PRIVMSG #" + channel + " :" + "Connected " + "\r\n", "UTF-8"))
        self.alive = True

        readerthread = threading.Thread(target=self.read_chat)
        readerthread.start()

    def read_chat(self):
        while self.alive:
            for line in str(self.s.recv(1024)).split('\\r\\n'):
                if "PING :tmi.twitch.tv" in line:
                    print(time.strftime("%H:%M:%S"), "PONG :tmi.twitch.tv")
                    s.send(bytes("PONG :tmi.twitch.tv\r\n", "UTF-8"))
                else:
                    print(line)
                    parts = line.split(":")
                    print(parts)

def main():
    tc = twitch(HOST, PORT, NICK, PASS, CHANNEL)

将字符串(行)打印到控制台会生成:b':username!username@username.tmi.twitch.tv PRIVMSG #username :test

但是,当我拆分字符串并打印字符串(部分)列表时,它会产生以下结果: [“b”,'用户名!用户名@用户名.tmi.twitch.tv PRIVMSG #username','测试'] ' ["'"]

【问题讨论】:

【参考方案1】:

您正在读取字节。因此,b'...'。 What does the 'b' character do in front of a string literal?

将其转换为字符串,然后进行处理。 Convert bytes to a string?

链接中的代码。

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'

【讨论】:

非常感谢您的回复。我尝试添加 x = line.decode("UTF-8") 并得到: AttributeError: 'str' object has no attribute 'decode' for line in str(self.s.recv(1024)).split('\\r\\n'): 您似乎正在转换为字符串。移除石膏。 for line in (self.s.recv(1024)).split('\\r\\n'): 然后解码字节

以上是关于Python字符串split()方法读取IRC时导致索引错误的主要内容,如果未能解决你的问题,请参考以下文章

Python 扭曲的 irc:在 privmsg 方法中等待 whois 回复

python中分割字符串split切割并选择输出 逐行读取文件后字符串拼接

python工具箱--文本读取

Python读取文件,使用split进行分割时,出现ufeff

Python Twisted IRC,发送颜色信息

如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?