【问题标题】:How to close the file after pickle.load() in python如何在python中的pickle.load()之后关闭文件
【发布时间】:2013-11-20 16:11:15
【问题描述】:

我用这种方式保存了一个python字典:

import cPickle as pickle

pickle.dump(dictname, open("filename.pkl", "wb"))

我以这种方式将它加载到另一个脚本中:

dictname = pickle.load(open("filename.pkl", "rb"))

在此之后如何关闭文件?

【问题讨论】:

    标签: python pickle data-dictionary


    【解决方案1】:

    最好改用with statement,它会在语句结束时关闭文件,即使发生异常:

    with open("filename.pkl", "wb") as f:
        pickle.dump(dictname, f)
    ...
    with open("filename.pkl", "rb") as f:
        dictname = pickle.load(f)
    

    否则,文件只会在垃圾收集器运行时关闭,而何时发生这种情况是不确定的,几乎无法预测。

    【讨论】:

    • 你能解释一下这段代码吗?我的理解是,我们打开一个文件读取和'b'模式(不确定那是什么)首先'f'代表文件的别名,然后我们将该别名传递给pickle.load(f)所以文件将以序列化方式加载。那是对的吗 ?还有什么是dictname的数据类型。
    【解决方案2】:

    使用with 语句是更好的方法,但恰恰相反,如果你没有使用with,你应该保留一个文件句柄……然后从那里关闭。

    f = open('filename.pkl', 'wb')
    pickle.dump(dictname, f)
    f.close()
    

    在另一个脚本中:

    f = open('filename.pkl','rb')
    dictname = pickle.load(f)
    f.close()
    

    这实质上就是with 为你做的事情。

    但是……如果您被卡住(无论出于何种原因),您最初发布的代码并回答您最初的问题……是的,垃圾收集器将在未来某个未指定的时间为您关闭它。或者您可以使用gc 模块跟踪对文件对象的引用,然后将其关闭。有一些代码可以帮助您做到这一点,例如:https://github.com/uqfoundation/dill/blob/master/dill/pointers.py

    但是,withf.close() 更受欢迎,除非您真的处于困境中,否则应避免跟踪 gc 模块。

    【讨论】:

      【解决方案3】:

      我猜人们只是想避免手动关闭文件。使用 pickle.loads() / dumps() 和 pathlib 方法可以这样做:

      import pickle
      import pathlib # Must be Python 3.5 or above
      
      # one line to load pkl, auto closing file
      data = pickle.loads(pathlib.Path('path/to/pkl').read_bytes())
      
      # also one line to dump, auto closing file
      pathlib.Path('path/to/save').write_bytes(pickle.dumps(data))
      

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 2022-12-29
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多