【问题标题】:Pickling lists in a for loop在 for 循环中酸洗列表
【发布时间】:2019-03-26 11:47:05
【问题描述】:

我创建了一个创建长数据列表的程序。最终,我想将这些列表聚合到一个数据框中——但它需要几个小时才能运行,并且可能由于错误或异常而在这段时间内崩溃。我会解决这个问题,但同时我想让列表持久化,这样程序就可以从中断的地方重新开始。

第一个问题:pickle 是一种合适的方法吗?

我的方法:为了腌制列表,我通过一个变量列表(字符串)来处理列表名称(listnames)。然后尝试从pickle加载每个,如果由于文件不存在而失败,那么它将创建一个空白列表。这些列表都被放入字典中。然后将每个列表腌制为 list_name.pickle。

listnames=["listname1","listname2","listname3","listname4","listname5","listname6","slistname7"]
dct = {}

for i in listnames:
    picknm=i+".pickle"
    try:
        dct[i]= pickle.load(open(picknm, "rb"))
        print("List ",i," loaded from pickle")
    except:
        dct['%s' % i] = []
        print("List ",i," failed to load from pickle. List is blank: ",dct[i]," Saving to pickle as",picknm)
        pickle.dump(open(dct[i],picknm,"wb"))

我无法让最后一行代码工作。错误是“TypeError: an integer is required (got type str)”,但是,我想我需要将列表腌制为“something.pickle”,它是一个字符串。

另外请你一般地批评我的代码。谢谢

【问题讨论】:

  • 您肯定可以看到open(dct[i],picknm,"wb") 不可能是正确的吗?
  • @Aran-Fey 不,我没有看到。有时您在自己的代码中看不到错误,对吧?

标签: python list dictionary pickle


【解决方案1】:

你对泡菜转储的论点有误。

pickle.dump(dct[i], open(picknm,"wb"))

首先是数据,然后是文件句柄。
但是真的看不出空列表打开失败保存的意义吗?

【讨论】:

  • 感谢您的回答!我忽略了我的错误。所以我所说的“如果无法打开则保存一个空列表”的意思是程序将尝试打开一个包含该列表的泡菜文件,但如果泡菜文件不存在,那么它将创建一个空列表,例如' listname1=[] ' 然后腌制该列表,例如'pickle.dump(dct[i], open(picknm,"wb")) '
  • 好吧 :) 我明白了。但问题现在解决了吗?
  • 是的。我的代码上的任何其他 cmets 都会有所帮助。感谢您的意见!
  • 其他一些cmets,你索引字典不同,你会得到相同的结果,但看起来很奇怪。 dct[i] 在 try 块中,dct['%s' % i] 在 except 块中。
  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多