在python中,我有一个函数可以返回网站上最新链接(到文件夹)的列表。我还有另一个从这些文件夹下载最新文件的功能。我计划每天运行这个脚本。我有一个全局列表,其中包含下载功能每次运行最新文件夹时访问的文件夹链接。我想每五天更新一次全局列表,并在接下来的5天内保持静态,我会运行代码直到它再次更新。
有点像这样:
list = ["link1", "link2",...]
def update():
#code to update list
return list
def download(list):
#code to download from links
所以我希望更新功能每5天运行一次(我知道该怎么做)以及每天运行的下载功能。那么如何将从update()static返回的列表作为全局列表保留,直到它再次更新?
编辑: 让我试着澄清一下:
我在星期一运行:
list = ["link1", "link2"]
def update():
#code to update list
return list #--> list = ["link1", "link2", "link3"]
def download(list):
#code to download from links
此工作正常,列表已更新并在下载()中使用。
我在星期二运行:
list = ["link1", "link2"]
#update() won't run today, only runs every 5 days
def update():
#code to update list
return list #--> list = ["link1", "link2", "link3"]
def download(list):
#code to download from links
我重新启动了我的代码,但现在列表中没有来自星期一的link3。如何在列表中保留link3,直到我再次更新列表?
由于
答案 0 :(得分:10)
使用global
声明。但是如果您在原地修改它们,则不需要global
可变对象。
您可以使用pickle
等模块将列表存储在文件中。您可以在想要使用时加载列表,并在进行修改后将其存储回来。
lis = ["link1", "link2",...]
def update():
global lis
#do something
return lis
Pickle示例:
import pickle
def update():
lis = pickle.load( open( "lis.pkl", "rb" ) ) # Load the list
#do something with lis #modify it
pickle.dump( lis, open( "lis.pkl", "wb" ) ) #save it again
为了获得更好的性能,您还可以使用cPickle模块。
答案 1 :(得分:2)
变量的正常声明将使其成为本地 使用global关键字使其呈现为全局。
只需将列表写入文件并访问它,稍后再从中读取。
如果您不想自行运行代码,可以使用cron-job为您执行此操作。
def read_file(filename):
f = open(filename).read().split()
lis = []
for i in f:
lis.append(i)
return lis
def write_file(filename,lis):
f = open(filename,"w")
for i in lis:
f.write(str(i)+'\n')
答案 2 :(得分:1)
只要它在主程序中声明而不在函数范围内,您就可以从那里操纵list
变量(您的评论)就好了。如果要在方法范围内将其初始化为全局,可以使用global
关键字将范围扩展到整个程序
list = ["link1", "link2",...]
def update():
list.append("link25")
return list
会根据需要将link25附加到全局列表
如果您希望列表在运行之间保持持久性,您可以将其保存到文件并每次从该文件加载它或将其保存到数据库并从数据库加载它(如果您需要它在多台计算机上工作)
您可以通过执行此操作将列表中的项目写入文件
for item in thelist:
thefile.write("%s\n" % item)