基于文本文件字符串的Python条件语句

时间:2015-04-16 18:42:26

标签: python

Noob在这里提问。我每隔2小时为Python脚本安排cron作业,但我希望脚本在48小时后停止运行,这不是cron的功能。为了解决这个问题,我使用计数标记x在文本文件中记录脚本末尾的执行次数,并在脚本开头打开文本文件,只有在count小于n

但是,无论条件如何,我的脚本似乎总是运行。这是我尝试过的一个例子:

with open("curl-output.txt", "a+") as myfile:
    data = myfile.read()

    finalrun = "xxxxx"

    if data != finalrun:
        [CURL CODE]

        with open("curl-output.txt", "a") as text_file:
            text_file.write("x")
            text_file.close()

我想我在这里错过了一些简单的东西。请告知是否有更好的方法来实现这一目标。提前谢谢。

5 个答案:

答案 0 :(得分:2)

您的原始代码存在的问题是您在a+模式下打开文件,这似乎将搜索位置设置为文件的末尾(在您之后立即尝试print(data)读取文件)。如果您使用r代替它,它会起作用。 (我不确定它应该是怎样的。This answer声明它应该写在最后,但从头开始读。documentation isn&# 39;非常清楚)。

一些建议:您可以只检查数据的长度("xxxxx"),而不是与if len(data) < 5字符串进行比较。或者,如建议的那样,使用pickle存储一个数字,可能如下所示:

import pickle
try:
    with open("curl-output.txt", "rb") as myfile:
        num = pickle.load(myfile)
except FileNotFoundError:
    num = 0

if num < 5:
    do_curl_stuff()
    num += 1
    with open("curl-output.txt", "wb") as myfile:
        pickle.dump(num, myfile)

关于原始代码的另外两件事:您使第一个with块大于它需要的块。在您将字符串读入data后,您就不再需要该文件对象,因此您可以从除data = myfile.read()之外的所有内容中删除一级缩进。

此外,您不需要手动关闭text_filewith会为您做到这一点(这就是重点)。

答案 1 :(得分:1)

那么可能会有一个行尾跳转\n字符,这会使您的文件包含xx\n而不仅仅是xx。这可能就是你的病情不起作用的原因:)。

修改

如果通过python命令行键入

会发生什么
open('filename.txt', 'r').read() # where filename is the name of your file

您将能够看到是否有\n

答案 2 :(得分:1)

使用at命令进行作业调度的声音更多?

有关不同的作业调度机制,请参阅http://www.ibm.com/developerworks/library/l-job-scheduling/

答案 3 :(得分:1)

对我来说很明显的第一个错误是,即使data == finalrun,您也要附加到该文件。因此,当data == finalrun时,您不会运行卷曲但是您确实附加了另一个&#39; x&#39;到文件。在下次运行时,data将再次不等于finalrun,因此它将继续执行curl代码。

解决方案当然是在if语句下嵌套附加到文件的代码。

答案 4 :(得分:0)

尝试将此条件与if子句一起使用。

if data.count('x')==24

data字符串可能包含无关数据行的新行字符。检查repr(data)以查看它是否真的是24 x。