【问题标题】:Difference between pickle and opening a file?泡菜和打开文件的区别?
【发布时间】:2020-10-17 14:07:51
【问题描述】:

使用pickle库和使用with open()有什么区别?

两者具有相同的功能,您可以读取和写入文件,我看不出它们之间有任何区别。

如果with open() 看起来如此相似,为什么很多人使用pickle 比使用它更多?

【问题讨论】:

  • 我对此感到困惑。您仍然必须有一个打开的文件才能对pickle 执行任何操作。也许你可以展示一些代码 sn-ps 来更好地说明这个问题?
  • 在我的脑海中,pickle 的好处是它可以将对象转换为字节流并将其写入文件,反之亦然。在with open() 子句中手动执行此操作并不那么简单。如果您需要更多详细信息,我建议您熟悉the Pickle documentation
  • @KarlKnechtel 好的,但这只是证明了我的观点。如果您还必须为 pickle 打开一个文件,为什么不能只使用with open

标签: python pickle with-statement


【解决方案1】:

让我看看我是否能理解混淆点在哪里,并给出有用的解释。

open你如何获得file object,它是 Python 程序和磁盘上实际文件之间的接口。 with 是用于确保文件对象在适当的时间关闭的工具。

文件对象允许你读取和/或写入文件,这取决于它是如何opened。执行此操作的内置方法是使用对象自己的功能。这使您可以编写任何您想要的数据,但您需要负责确定该数据应该是什么;或者,它可以让您读取数据并赋予您解释该数据的权力和责任。

pickle 库建立在该功能之上,使用文件的内容表示本机 Python 对象。它为您完成解释(解析)和数据计算(格式化)工作,完成手工难以完成的事情。权衡是它以特定方式工作,并且仅适用于特定目的 - 例如,您不会以这种方式生成或解释纯文本文件、图像或 JSON 数据等很快(您可以自己编写数据,或使用不同的专用库 - 当然纯文本除外,除了使用内置功能)。

【讨论】:

    【解决方案2】:

    不同之处在于您放入文件中的内容,以及谁负责底层文件的格式/序列化。

    使用内置的open,您会收到一个原始文件句柄。你可以写任何你想写的东西。它不必是结构化的,它不必是一致的,地狱它甚至不必让外部观察者有意义。您可以将任何您想要的内容写入文件。

    使用pickle,底层模块负责编写的内容。它以可以重新加载的一致、可重现的格式序列化 python 对象(尽可能多的,有无法腌制的类的示例)。 IE - 您可以将实际 python 对象的状态保存在静态文件中,然后重新加载它们并在解释器下一次运行时以 identical 对象结束。这在处理有状态程序时具有优势。

    奖励:shelve 模块作为pickle 的用户友好前端,其行为类似于字典。当您关闭架子时,内容将序列化到磁盘。当您重新打开书架时,对象会从文件中反序列化,并且可以像字典一样访问。

    【讨论】:

      【解决方案3】:

      pickle 允许您方便地向其写入 python 对象,并加载这些对象。您如何使用open() 将字典写入文件,并且能够通过简单的一行将其加载到您的 python 文件中?

      对于open(),它将是:

      dct = {'a': 1,
             'b': 2,
             'c': 3,
             'd': 4,
             'e': 5}
      
      with open('file.txt','w') as f:
          f.write('\n'.join([f"{k}, {v}" for k, v in dct.items()]))
      
      with open('file.txt','r') as f:
          dct = {k: int(v) for k, v in [s.split(', ') for s in f.read().splitlines()]}
      

      pickle:

      import pickle
      
      dct = {'a': 1,
             'b': 2,
             'c': 3,
             'd': 4,
             'e': 5}
      
      with open('file.txt','wb') as f:
          pickle.dump(dct, f)
          
      with open('file.txt','rb') as f:
          dct = pickle.load(f)
          
      

      注意第一种方法中的转换,我们需要将字符串转换为整数。有了pickle,您就不必担心这些了。

      【讨论】:

        【解决方案4】:

        pickle 是使用 with open() 编写的库函数,用于将对象转换为字节流以节省开发人员的工作量。

        更多信息:https://docs.python.org/3/library/pickle.html 这是代码:https://github.com/python/cpython/blob/main/Lib/pickle.py

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 2021-11-14
          • 2017-03-05
          • 2018-10-27
          相关资源
          最近更新 更多