我正在学习Python,作为一个学习项目,我正在开发一个Twitter机器人。我使用的是Python 3.我使用以下行来发推文。
李小龙最喜欢的饮料是什么? Wataaaaah! 这位阅读障碍的恶魔崇拜者把他的灵魂卖给了圣诞老人。 你用一块牛排杀死了素食吸血鬼。 有一个监狱休息时间,我看到一个侏儒爬上篱笆。当他跳下来时,他嘲笑我,我想,这有点居高临下。
这是我使用Twython发推文的代码:
from twython import Twython, TwythonError
import time
APP_KEY = '##########' # Customer Key here
APP_SECRET = '#############' # Customer secret here
OAUTH_TOKEN = '###############' # Access Token here
OAUTH_TOKEN_SECRET = '################' # Access Token Secret here
twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
try:
with open('jokes.txt', 'r+') as file:
buff = file.readlines()
for line in buff:
if len(line)<140:
print ("Tweeting...")
twitter.update_status(status=line)
time.sleep(3)
with open ('jokes.txt', 'r+') as file:
buff.remove(line)
file.writelines(buff)
else:
with open ('jokes.txt', 'r+') as file:
buff.remove(line)
file.writelines(buff)
print ("Skipped line - Char Length Violation")
continue
except TwythonError as e:
print (e)
我想在控制台Skipped line - Char Length Violation
上跳过包含140多个字符的行,然后删除该特定行并更新文件。脚本通过忽略该行成功发送推文,但无法打印控制台消息。它也无法从文本文件中删除该行。
我不知道为什么跳过第三行You kill vegetarian vampires with a steak to the heart.
。
我的代码出了什么问题以及运行脚本后我的文本文件是这样的:
诵读困难的恶魔崇拜者把他的灵魂卖给了圣诞老人 有一个监狱休息,我看到一个侏儒爬上围栏。当他跳下来 他嘲笑我,我想,这有点居高临下 在我身边,我想,这有点居高临下。我想, 好吧,这有点居高临下。
答案 0 :(得分:0)
file.close()
似乎在with ... as file:
块下错位。 with
的优点是您不需要执行此簿记。
在else
块中,file
对象已关闭,因此file.writelines()
应引发异常。
据我所知,buff
是一个字符串,因此是不可变的。您可能想尝试buff = buff.remove(...)
,但是它是否还有remove
方法?
答案 1 :(得分:0)
首先,尽量避免使用file
命名变量,因为它是Python中用于类型file
的保留关键字。
固定代码:
from twython import Twython, TwythonError
import time
APP_KEY = '##########' # Customer Key here
APP_SECRET = '#############' # Customer secret here
OAUTH_TOKEN = '###############' # Access Token here
OAUTH_TOKEN_SECRET = '################' # Access Token Secret here
twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
try:
with open('jokes.txt', 'r+') as fp:
buff = fp.readlines()
for line in buff[:]:
if len(line) < 140:
print("Tweeting...")
twitter.update_status(status=line)
time.sleep(3)
with open('jokes.txt', 'w') as fp:
buff.remove(line)
fp.writelines(buff)
else:
with open('jokes.txt', 'w') as fp:
buff.remove(line)
fp.writelines(buff)
print("Skipped line - Char Length Violation")
continue
except TwythonError as e:
print(e)
通常 - 就像在这种情况下一样 - 在一个循环内修改你的iterable(list)并不是一个好主意,它在同一个iterable上迭代。这里的技巧是行for line in buff[:]:
中的切片运算符,它生成buff
列表的副本,并在副本而不是原始buff
列表上进行迭代。
此外,当您要覆盖文件时,必须以“w”模式打开,而不是“r +”模式,因为“r +”不会先截断文件。