【问题标题】:Recursively load from cPickle and create variables to store them从 cPickle 递归加载并创建变量来存储它们
【发布时间】:2014-08-21 05:39:18
【问题描述】:

我手头有 26 个.pkl 文件,从dict_a.pkldict_z.pkl。我想将它们加载到内存中,所以我可以比较以从dict_a.pkl 加载的变量开头的元素。我想这样做的原因是每个文件都很大,如果我把它们都放在一个大文件中,它会太大而无法消化。如果我以 ad hoc 样式加载文件,那么它将不断读取磁盘。

import string
alphabet = string.lowercase

for alpha in alphabet:
   ff = 'dict_'+alpha+'.pkl'
   with open(ff, 'r') as tt:
       temp = cPickle.load(tt)

如何在循环中将temp变量替换为dict_adict_b,这样我在循环之后,可以直接将变量dict_a改成dict_z

【问题讨论】:

  • 你可以有一个 dict 的键 'dict_a', dict_b, ... 对应的值是泡菜对象
  • 您可能会喜欢的一个技巧:您可以将多个泡菜保存到一个文件中,然后一个一个地加载它们。您不需要 26 个文件。
  • 谢谢,@bernie。我腌制的东西是一维以上的列表。索引它们时,代码将变得如此难以阅读。我会尝试找出其他方法。

标签: python variable-names


【解决方案1】:

您可以使用 glob 模块加载腌制文件,然后逐一处理。

    import glob
    import cPickle as pickle
    picklefiles = glob.glob('*.pkl')
    for pklfile in picklefiles:
       with open(pklfile,'rb') as f:
           pklfile = pickle.load(f)

现在您有 26 个字典及其对应的文件名。

编辑:你说得对@Sean 我搞砸了第三行,它应该是 picklefiles 而不是 pklfiles。我已经更新了代码 sn-p

编辑 2:picklefiles 是一个包含所有扩展名为 .pkl 的文件名的列表。在这种情况下

picklefiles = [  'dict_a.pkl', 'dict_b.pkl', ........ 'dict_z.pkl' ]

在 for 循环中,我打开每个文件并将字典加载到具有相应文件名的字典中。

例如:

(这是一个字典类型的变量) dict_a.pkl = { values from dict_a.pkl }

【讨论】:

  • 我尝试运行您的代码。如果我是正确的,第三行应该是 ('*.pkl')。
  • 我尝试运行您的代码。如果我是正确的,第三行应该是 ('*.pkl')。 pklfiles 只是一个包含 pkl 文件的所有文件名的列表,例如 dict_x.pkl。从代码中,我想它会输出像dict_x.pkl 这样的变量。但这绝对不是变量名。运行代码后,我只得到了 pklfile 作为包含最后一个 pkl 文件内容的变量。
  • 可能是我运行的不对,运行代码后,只得到了一个变量pklfile,里面包含了最后一个pkl文件的内容。
  • 第三行应该是picklefiles = glob.glob('*.pkl')。结果是picklefiles,对吧?
  • 所以,实际上在for 循环中。你用pickle文件替换picklefiles中的原始字符串?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2017-11-29
相关资源
最近更新 更多