Python程序在程序启动时没有正确读取文本文件?

时间:2016-02-09 21:35:38

标签: python regex bots reddit praw

我一直在努力让这个计划发挥作用。它是一个reddit机器人的程序,当你用“" snekpic"”这个词发表评论时,会回复带有蛇图片的评论。最初,当它回复评论时,它会将评论ID保存在列表中,这样它就不会多次回复评论。但这有一个小问题,因为每当程序重新启动时,它将以空列表重新开始,并且它将回复它已经回复的所有注释。因此,我将注释ID保存到文本文件并读取文本文件,而不是列表。它似乎能够读取文本文件,因为它不会多次回复注释,但它具有我之前遇到的相同问题。当我重新启动程序时,它会回复它已回复的所有注释。所以由于某种原因,它在启动时没有正确读取文本文件。这是代码:

import praw
import TagFinder as Tf
import re
import random

user_agent = "xxx 0.2 by /u/xxx and /u/xxx"
r = praw.Reddit(user_agent=user_agent)

r.login(username='xxx', password='xxx')

possible_tags = ['standing', 'corn', 'ball', 'burmese', 'hognose', 'clothes', 'art', 'cool', 'funny', 'gif']

comment_regex = re.compile(r'(^snekpic)(\s+(\w+))?')

messages = {1: 'hissss', 2: 'snek?', 3: 'SNEK!', 4: 'sssss', 5: 'boop',
            6: 'slither slither', 7: 'Don\'t tread on me', 8: 'I am sssummoned.',
            9: 'Give me a mousssse please.', 10: 'BEEP ^BOOP BOP I AM ROBOSNEK', 11: 'Snek.'}

while True:
    all_comments = praw.helpers.comment_stream(r, 'test')
    for comment in all_comments:
        try:
            comment_text = comment.body.lower()
            mo = comment_regex.search(comment_text)

            with open('already_done.txt', 'a+') as already_done:
                already_done.seek(0)
                if comment.id not in already_done.read() and mo is not None and mo.group(3) is not None:
                    if mo.group(3) in possible_tags:
                        try:
                            comment.reply('[' + messages[random.randint(1, 11)] + '](' + Tf.search(mo.group(3)) + ')')
                            already_done.write(str(comment.id) + '\n')
                            already_done.seek(0)
                        except (praw.errors.InvalidComment, praw.errors.RateLimitExceeded):
                            pass
                    else:
                        try:
                            comment.reply('Thisss category does not exissst! [Here\'s a picture of a snek anyway!](' +
                                          Tf.search() + ')')
                            already_done.write(str(comment.id) + '\n')
                            already_done.seek(0)
                        except (praw.errors.InvalidComment, praw.errors.RateLimitExceeded):
                            pass
                    already_done.seek(0)
                elif comment.id not in already_done.read() and mo is not None and mo.group(3) is None:
                    try:
                        comment.reply('[' + messages[random.randint(1, 11)] + '](' + Tf.search() + ')')
                        already_done.write(str(comment.id) + '\n')
                        already_done.seek(0)
                    except (praw.errors.InvalidComment, praw.errors.RateLimitExceeded):
                        pass
                    already_done.seek(0)
        except AttributeError:
            pass

TagFinder是一个返回网址的独立程序。我发现在读取文件后,它会将读取光标移动到文件的末尾,因此如果要再次读取它,则必须使用seek(0)将光标移回到开头。所以我将seek(0)放在with语句的开头,每次读取或追加文件后(我不确定附加是否会移动读取光标)。

这个程序实际上是为高中编程课程,所以我请求帮助,我的老师建议编写一个更简单的程序版本,看看是否有效。所以我写了以下简短程序

import time

while True:
    with open('already_done.txt', 'a+') as o:
        o.seek(0)
        if 'corn' in o.read():
            print('FOUND')
            o.write('\nFOUND')
        else:
            print('NOT FOUND')
            o.write('\nNOT FOUND')
    time.sleep(3)

一切都很完美。它发现了'"玉米"在启动时的文本文件中,每隔3秒,它也一直写入文件。由于这个工作,我真的很难过。我不知道更大的计划会出现什么问题。我愿意接受任何帮助或想法。

PS:对于缺乏评论感到抱歉。我计划在程序运行后添加它们。如果有什么不清楚,我很乐意解释。

1 个答案:

答案 0 :(得分:0)

问题可能在于此代码:

if comment.id not in already_done.read()

如果comment.id是一个整数,则该值始终为True,因为read()返回一个字符串。