删除和更新文本文件中的行 - Python

时间:2014-05-10 13:28:33

标签: python twitter

我正在学习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.

我的代码出了什么问题以及运行脚本后我的文本文件是这样的:

  诵读困难的恶魔崇拜者把他的灵魂卖给了圣诞老人   有一个监狱休息,我看到一个侏儒爬上围栏。当他跳下来   他嘲笑我,我想,这有点居高临下   在我身边,我想,这有点居高临下。我想,   好吧,这有点居高临下。

2 个答案:

答案 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 +”不会先截断文件。