[英]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.