2017-09-06 37 views
0

以下代碼片段是使用Twython的推特機器人的核心。 我想知道我是否可以將讀入的文件合併到列表理解 中,因爲看起來相當複雜,因爲它只是讀取一行項目列表,然後 從中創建另一個多項列表。可以通過列表切片將列表理解結合起來嗎?

我檢查了一下,發現了一些使用 readlines()讀取整個文件的例子,但是也沒有涉及到切片的一個例子。

with open(tweet_datafile,'r') as smstweets: 
    bigtweet = smstweets.readline().strip() 
    text_entire = [ bigtweet[i:i+140] for i in range(0,len(bigtweet),140) ] 

for line in range(len(text_entire)): 
    twitter.update_status(status=text_entire[line]) 

注:

的Python 2.7,Linux操作系統。如果需要的話,Python 3.5安裝&。 。

的ReadLine()條()的使用,因爲我希望能夠讀取任意長度的線 一個文件,並刪除任何EOL和空白(列表中的最後一個項目 最終可能作爲唯一的空間; twitter會拒絕空格狀態更新,並且我還沒有爲此寫任何錯誤處理)。

我只讀取輸入文件的第一行,然後在代碼中將文件寫回 減去該行。我決定這是我的有限技能的最簡單的解決方案,因爲機器人不會24/7運行

我不是程序員,我用一堆示例代碼將它們一起砍掉了我發現在堆棧上發現了一堆 溢出和其他地方。我試圖使用非常簡單的 代碼,而不是依賴Twython之外的第三方庫。生成器和迭代器 顯示爲對我的巫術。

+0

我再定位的重複數據刪除技術,以[split py generator(splitEvery)](// stackoverflow.com/q/1915170)中的每n個項目中的一個生成器/可迭代,因爲它更好地覆蓋了文件的情況。 –

+0

@MartijnPieters然而,這個複製並沒有真正回答OP的問題,這不是「如何將一個序列分割成固定長度的塊」,而是「如何將這個分割與文件中的讀取結合起來」。 –

+0

你不**創建一個元素列表,'bigtweet'只是一個字符串。沒有什麼複雜的。恕我直言,示例代碼已經足夠好了。 –

回答

0

好吧,也許只是一個小的變化 - 這是沒有必要的名單分配給一個變量,也沒有對指數進行迭代,該列表可以直接遍歷:

with open(tweet_datafile,'r') as smstweets: 
    bigtweet = smstweets.readline().strip() 
for line in (bigtweet[i:i+140] for i in range(0,len(bigtweet),140)): 
    twitter.update_status(status=line) 
+1

然後*至少*使那個生成器表達式,而不是列表理解。你對這個清單別無所物。 –

+0

@MartijnPieters生成器表達式顯然會更有記憶效率,但也可能比列表理解更慢(至少這是我的經驗),所以根據優化目標是什麼,您的建議可能是有效的或不是有效的。 –

+1

它不會變慢*在這裏*;字節碼幾乎相同,但沒有列表。因此,它實際上大約快了20%(對於輸入的10.000個隨機ASCII字母字符串,Python 3.6.2)。 –

相關問題