Как обновить глобальную переменную в Python
В 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 с понедельника. Как сохранить ссылку 3 в списке на следующие 5 дней, пока я снова не обновлю список?
Спасибо
3 ответа
Использование 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.
Обычное объявление переменной сделает ее локальной.
Используйте глобальное ключевое слово, чтобы сделать его глобальным.
Просто запишите список в файл и получите к нему доступ, прочитайте его позже.
Если вы не хотите самостоятельно запускать код, вы можете использовать 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')
Пока это объявлено в основной программе, а не в рамках функции, вы можете хорошо манипулировать вашим list
переменная оттуда (ваш комментарий) просто отлично. Если вы хотите инициализировать его как глобальный в рамках метода, вы можете использовать global
ключевое слово, чтобы расширить область действия всей программы
list = ["link1", "link2",...]
def update():
list.append("link25")
return list
добавит ссылку 25 в глобальный список, как вы хотели
Если вы хотите, чтобы ваш список был постоянным между запусками, вы можете сохранить его в файл и каждый раз загружать его из этого файла или сохранять в базу данных и загружать из базы данных, если он нужен для работы на нескольких компьютерах.
Вы можете записать элементы в вашем списке в файл, выполнив это
for item in thelist:
thefile.write("%s\n" % item)