【问题标题】:Save the current state of program and resume again from last saved point保存程序的当前状态并从上次保存的点再次恢复
【发布时间】:2019-10-10 17:38:43
【问题描述】:

我有一个从链接下载图像的脚本。假设脚本由于某种原因被终止,那么我想保存图像已下载的点并从上次保存的点再次恢复

我已经制作了下载脚本并尝试使用pickle保存程序的状态到现在

import pandas as pd
import requests as rq
import os,time,random,pickle
import csv
data=pd.read_csv("consensus_data.csv",usecols=["CaptureEventID","Species"])

z=data.loc[ data.Species.isin(['buffalo']), :]

df1=pd.DataFrame(z)

data_2=pd.read_csv("all_images.csv")

df2=pd.DataFrame(data_2)

df3=pd.merge(df1,df2,on='CaptureEventID')

p=df3.to_csv('animal_img_list.csv',index=False)

# you need to change the location below
data_final = pd.read_csv("animal_img_list.csv")
output=("/home/avnika/data_serengeti/url_op")

mylist = []

for i in range(0,100):
    x = random.randint(1,10)
    mylist.append(x)

print(mylist)

for y in range(len(mylist)):
    d=mylist[y]
    print(d)

file_name = data_final.URL_Info
print(len(file_name))
for file in file_name:
    image_url='https://snapshotserengeti.s3.msi.umn.edu/'+file
    f_name=os.path.split(image_url)[-1]
    print(f_name)
    r=rq.get(image_url)

    with open(output+"/"+f_name, 'wb') as f:
        f.write(r.content)
    time.sleep(d)


with open("/home/avnika/data_serengeti","wb") as fp:
    pickle.dump(r,fp)

with open("/home/avnika/data_serengeti","rb") as fp:
    pic_obj=pickle.load(fp)

假设我必须从一个 URL 下载 4000 张图像。我成功下载了 1000 张图片,但由于某些网络问题,我的脚本崩溃了。所以我希望当脚本重新启动时,它应该从图像编号 1001 开始下载。目前,如果脚本重新启动,它会再次从图像编号 1 重新开始。加载泡菜对象后如何再次运行循环?

【问题讨论】:

  • 我认为不可能,但你可以做的是,检查图像的文件名,如果已经下载,则跳过它。

标签: python python-3.x pandas python-requests


【解决方案1】:

您的问题的答案是使用 pickle 在 python 中保存对象,您可以简单地将对象保存在 pickle 中并根据您的条件检索它。因此,每当您遇到错误时,只需捕获错误并将 pickle 中的数字转储到您想要启动脚本的位置即可。 你可以参考下面的链接。 https://pythonprogramming.net/python-pickle-module-save-objects-serialization.

【讨论】:

  • pickle 在这种情况下将如何提供帮助?您将存储哪个对象? OP 想从 URL 下载图片。
  • 哦,我现在明白了!您可以检查一下该网址是否包含一些过滤器,您可以在其中将起点作为过滤器参数传递给终点。
  • @hi anmol 你可以在我的代码中看到最后几行。我正在创建泡菜对象并加载相同的对象。您能否根据您的建议修改代码?我对在泡菜中倾倒数字有点困惑
【解决方案2】:

这个问题可能有多种解决方案,但首先要记住它会帮助您解决这个问题。

方法:

很清楚,脚本是从start开始下载的,因为到上次下载的地方记不起索引了。

为了解决这个问题,我们将创建一个具有整数 0 的文本文件,表示该索引文件已被下载。当脚本运行时,它会检查文本文件中存在的整数值是什么。 (这就像回忆位置)。如果文件下载成功,文本文件中的值会加 1。

代码

理解示例 ::

请看:我之前手动创建了一个带有“0”的文本文件。

# Opening the text file
counter =  open('counter.txt',"r")

# Getting the position from where to start.Intially it's 0 later it will be updated
start = counter.read()
print("-->  ",start)
counter.close()

for x in range(int(start),1000):
    print("Processing Done upto : ",x)

    #For every iteration we are writing it in the file with the new position      
    writer = open('counter.txt',"w")
    writer.write(str(x))
    writer.close()

修复你的代码:

注意:手动创建一个名为“counter.txt”的文本文件,并在其中写入“0”。

import pandas as pd
import requests as rq
import os,time,random,pickle
import csv
data=pd.read_csv("consensus_data.csv",usecols=["CaptureEventID","Species"])

z=data.loc[ data.Species.isin(['buffalo']), :]

df1=pd.DataFrame(z)

data_2=pd.read_csv("all_images.csv")

df2=pd.DataFrame(data_2)

df3=pd.merge(df1,df2,on='CaptureEventID')

p=df3.to_csv('animal_img_list.csv',index=False)

# you need to change the location below
data_final = pd.read_csv("animal_img_list.csv")
output=("/home/avnika/data_serengeti/url_op")

mylist = []

for i in range(0,100):
    x = random.randint(1,10)
    mylist.append(x)

print(mylist)

for y in range(len(mylist)):
    d=mylist[y]
    print(d)

# Opeing the file you manually created with '0' present in it.
counter =  open('counter.txt',"r")
start = counter.read()
count = start
counter.close()

file_name = data_final.URL_Info
print(len(file_name))

# The starting position from the file is used to slice the file_name from 'start' value.
for file in file_name[start:]:
    image_url='https://snapshotserengeti.s3.msi.umn.edu/'+file
    f_name=os.path.split(image_url)[-1]
    print(f_name)
    r=rq.get(image_url)

    with open(output+"/"+f_name, 'wb') as f:
        f.write(r.content)

    # File is downloaded and now, it's time to update the counter in the text file with new position.
    count+=1
    writer = open('counter.txt',"w")
    writer.write(str(count))
    writer.close()

    time.sleep(d)

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2020-08-09
    • 2015-04-25
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多