2017-09-06 96 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)。 –

相关问题