2014-05-10 67 views
0

我正在學習Python,並且作爲一個學習項目,我正在開發一個twitter bot。我正在使用Python 3.我使用以下幾行來發送推文。刪除和更新文本文件中的行 - Python

什麼是李小龍最喜歡的飲料? 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) 

我想跳過這個擁有超過140個字符與控制檯Skipped line - Char Length Violation在消息上線,然後刪除特定的行和更新文件。該腳本通過忽略該行成功鳴叫,但無法打印控制檯消息。它也無法從文本文件中刪除該行。

我不知道爲什麼第三行You kill vegetarian vampires with a steak to the heart.被跳過。

我運行該腳本後,這有什麼錯我的代碼,爲什麼我的文本文件看起來像這樣:

的誦讀困難的魔鬼崇拜者,出賣了自己的靈魂聖誕老人。
有一次監獄休息時間,我看到一隻侏儒爬上圍欄。當他跳下 他嘲笑我,我想,這是一個有點居高臨下。 在我身上,我想,這是一個有點居高臨下。我認爲, 以及有點居高臨下。

回答

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) 

一般 - 像在這種情況下 - 這不是修改迭代(列表)一個週期內一個好主意,在同一個迭代其迭代。這裏的訣竅是for line in buff[:]:行中的切片運算符,它將複製buff列表,並在副本上迭代而不是在原始buff列表中進行迭代。另外,當你想覆蓋文件時,你必須以'w'模式打開它,而不是'r +'模式,因爲'r +'不會首先截斷你的文件。

0
file.close() 

似乎是with ... as file:塊下錯位。 with的優點是你不需要做這個簿記。

elsefile對象已關閉,所以file.writelines()應引發異常。

據我所見,buff是一個字符串,因此是不可變的。您可能想嘗試buff = buff.remove(...),但它是否有remove方法?

+0

謝謝。我編輯了代碼。 –

+0

修正了'else'塊... –