簡體   English   中英

Python程序在程序啟動時無法正確讀取文本文件?

[英]Python program not correctly reading a text file on program startup?

我一直在努力使該程序正常工作。 這是一個用於reddit bot的程序,當您使用“ 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是一個單獨的程序,它返回url。 我發現,讀取文件后,它將讀取的光標移動到文件的末尾,因此,如果要再次讀取它,則必須使用seek(0)將光標移回開頭。 因此,我在with語句的開頭以及每次讀取或附加文件后都將seek(0)放在seek(0)不確定附加是否會移動讀取的游標)。

該程序實際上是針對高中編程班的,因此我尋求幫助,我的老師建議編寫一個更簡單的程序版本,看看是否可行。 所以我寫了下面的短程序

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秒)在文本文件中找到一個“ corn”一詞,並且還不斷寫入文件。 既然這行得通,我真的很沮喪。 我不知道更大的程序可能出什么問題。 我願意提供任何幫助或想法。

PS:很抱歉缺少評論。 我計划在程序運行后添加它們。 如果不清楚,我很樂意解釋。

問題可能在以下代碼中:

if comment.id not in already_done.read()

如果comment.id是整數,則它將始終為True,因為read()返回一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM