12

在 python 中,我有一个函数可以返回网站上最新链接(到文件夹)的列表。我还有另一个功能可以从这些文件夹中下载最新文件。我计划每天运行这个脚本。我有一个全局列表,其中包含下载功能每次运行最新文件夹时都会访问的文件夹链接。我想每五天更新一次该全局列表,并在接下来的 5 天内保持静态我运行代码,直到它再次更新。

它有点像这样:

list = ["link1", "link2",...]

def update():
  #code to update list
  return list

def download(list):
  #code to download from links

所以我希望更新功能每 5 天运行一次(我知道该怎么做),下载功能每天运行一次。那么我怎样才能将 update() 返回的列表保持为全局列表,直到它再次更新?

编辑:让我试着澄清一下:

我在星期一运行这个:

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

我重新启动了我的代码,但现在列表从星期一开始没有链接 3。在我再次更新列表之前,如何在接下来的 5 天内将链接 3 保留在列表中?

谢谢

4

3 回答 3

17

使用global声明。global但是,如果您要就地修改它们,则不需要可变对象。

您可以使用模块,例如pickle将列表存储在文件中。您可以在需要时加载列表,并在修改后将其存储回来。

lis = ["link1", "link2",...]

def update():
  global lis
  #do something
  return lis

泡菜示例:

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模块。

更多示例

于 2013-06-25T21:05:35.440 回答
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')
于 2013-06-25T21:14:29.240 回答
1

只要它在主程序中声明并且不在函数范围内,您就可以list从那里(您的注释)操作您的变量就好了。如果要将其初始化为全局,则可以在方法范围内使用global关键字将范围扩大到整个程序

list = ["link1", "link2",...]

def update():
  list.append("link25")
  return list

将根据需要将 link25 附加到全局列表

如果您希望您的列表在运行之间保持不变,您可以将其保存到文件中并每次从该文件中加载它,或者将其保存到数据库中并在需要它在多台机器上工作时从数据库中加载它

您可以通过执行此操作将列表中的项目写入文件

for item in thelist:
    thefile.write("%s\n" % item)

资源

于 2013-06-25T21:07:29.540 回答