elif data.find('PRIVMSG') != -1:
message = ':'.join(data.split (':')[2:])
if message.lower().find('code') == -1:
nick = data.split('!')[ 0 ].replace(':',' ')
destination = ''.join (data.split(':')[:2]).split (' ')[-2]
function = message.split( )[0]
print nick + ' : ' + function
arg = data.split( )
args = ''
for index,item in enumerate(arg) :
if index > 3 :
if args == '':
args = item
else :
args += ' ' + item
if data.find('.topic') != -1:
nick = data.split('!')[ 0 ].replace(':','')
for line in open('masters.txt'):
if nick in line:
sck.send('TOPIC ' + " " + chan + " " + args + '\r\n')
当我尝试执行类似.topic 1 2 3 4 5 6 7 8 9 10
之类的操作时,它会将频道主题更改为3 4 5 6 7 8 9 10
而不是整个1 2 3 4 5 6 7 8 9 10
我想知道为什么从3开始字符串而不是从头开始?我是否需要从字符串中拆分或剥离某些内容?
答案 0 :(得分:2)
这是显示问题的最小示例:
data = ".topic 1 2 3 4 5 6 7 8 9 10"
arg = data.split()
args = ''
for index,item in enumerate(arg):
if index > 3:
if args == '':
args = item
else:
args += ' ' + item
print args
这完全归功于if index > 3:
答案 1 :(得分:0)
我想知道为什么它从第3个字符串开始而不是从头开始?
因为这就是你告诉它的事情。 enumerate()
函数从0开始索引,因此索引0对应于字符串'topic'
,索引1对应于字符串'1'
,依此类推。因此,当您使用条件if index > 3
时,它将忽略前四个字符串(索引为0,1,2和3的字符串,在您的情况下为字符串'topic'
,'1'
, '2'
和'3'
)。
首先,我们可以大大简化循环到以下单行:
args = ' '.join(arg[4:])
也就是说,将arg
列表切片以从第四个条目开始获取所有条目,然后使用join()
函数将其连接成由字符' '
分隔的字符串。
其次,如果您只想删除第一个条目并将其余条目连接到字符串中,只需将索引更改为1:
args = ' '.join(arg[1:])
如果不同的命令需要以不同的方式处理arg
列表,那么您需要根据具体情况而不是在一个地方执行此操作:
arg = data.split()
if '.topic' in data:
nick = data.split('!')[ 0 ].replace(':','')
topic = ' '.join(arg[1:])
for line in open('masters.txt'):
if nick in line:
sck.send('TOPIC %s %s\r\n' % (chan, topic))
elif '.bannick' in data:
nick_to_ban = arg[0]
length = arg[1]
reason = ' '.join(arg[2:])
for line in open('masters.txt'):
if nick in line:
sck.send('BAN %s %s %s %s\r\n' % (chan, nick_to_ban, length, reason))
答案 2 :(得分:0)
我修复了代码中的错误。
if data.find('.topic') != -1:
nick = data.split('!')[ 0 ].replace(':','')
for line in open('masters.txt'):
if nick in line:
sck.send('TOPIC ' + " " + chan + " :" + args + '\r\n')
这个有效,我需要在声明通道变量后添加" :"
,以便它可以正确读取数据。