Python PRAW脚本修改split逻辑后触发'list'无format的AttributeError
问题根因
- 这次改动后出问题,本质是两个藏在代码里很久的隐患,被这次的分割逻辑调整触发了,和
splitlines()本身没有关系:- 你写的两处
[elem.lower() for elem in checkkw]、[elem.lower() for elem in topics_dict['body']]是完全无效的代码。列表推导是返回新列表的表达式,必须把返回值赋值回原变量,否则临时生成的内容执行完就会被内存回收,等于转小写的操作根本没落地。之前用split()能连跑30次没出问题,纯粹是当时测试的关键词本来就是全小写,刚好没碰到大小写不匹配的情况。 split()和splitlines()的切分规则差异很大。原来的split()默认会按所有空白字符(空格、换行、制表符、连续多空格)切分,还会自动过滤切出来的空字符串;但splitlines()只会严格按照换行符的边界切分,如果你的checkkw配置项是用空格分隔的多个关键词(不是换行分隔),切完得到的就是一整段长文本,根本没拆成独立的关键词列表,自然没法正确匹配帖子内容。splitlines()切出来的行自带首尾多余空格,不会像split()那样自动清理,也会导致匹配结果不准。
- 你写的两处
修正后的代码片段
把对应逻辑块替换成下面的写法即可解决问题:
if keyword['keyword'] == 'testing something': checkkw = keyword['checkkw'] # 先按行切分,再逐行按空格拆成独立关键词,自动过滤空行、空字符串 checkkw = [word.strip() for line in checkkw.splitlines() for word in line.split()] total = len(checkkw) else: checkkw = keyword['checkkw'] checkkw = checkkw.split() total = len(checkkw) # 真正将关键词转成小写,同步清理首尾空白 checkkw = [elem.lower() for elem in checkkw] # 将拼接后的帖子正文转成全小写,和关键词的大小写保持一致 full_post_body = " ".join(topics_dict["body"]).lower() print(total) print(checkkw) exists = 0 # 使用处理好的小写文本做匹配,不会因为大小写不一致漏判 if all(clean_kw in full_post_body for clean_kw in checkkw): print('posting') link = topics_dict['url'][0] print(link) result = self.dblinks.get(Query()['link'] == link) if result is not None: print('already posted to this link') else: try: reply_template = keyword['comment'] reply_text = reply_template.format(topics_dict["url"]) submission.reply(reply_text) self.dblinks.insert({'link': link}) time.sleep(1) except Forbidden: print('Error')
额外避坑提示
- 不要用无赋值的列表推导做数据修改操作,这是Python开发里非常容易踩的新手坑,临时生成的新列表没有被引用的话,会立刻被内存回收,完全起不到修改原数据的作用。
- 上面的嵌套拆分类写可以同时兼容换行、空格两种关键词分隔格式,不需要纠结选
split()还是splitlines(),适配性更强。
内容的提问来源于stack exchange,提问作者Steel Hard
相关产品推荐
相关产品推荐

