如何将列表保存到临时目录中的泡菜文件并将该文件传递给函数?

Posted

技术标签:

【中文标题】如何将列表保存到临时目录中的泡菜文件并将该文件传递给函数?【英文标题】:How do I save a list to a pickle file in a temporary directory and pass that file into a function? 【发布时间】:2014-04-26 05:19:56 【问题描述】:

问题是我从一个来源提取数据,我想将其作为 pickle 文件保存到保管箱。我无法将它保存在目录中,因为我在服务器 (iron.io) 上运行代码。

import tempfile
import pickle


def SFDCDropboxSync(Data):
   f = tempfile.NamedTemporaryFile(delete=False)
   pickle.dump(Data,open(f,'wb'))

   client = dropbox.client.DropboxClient(access_token)
   client.put_file(filename, f)

这是我得到的错误:

Traceback (most recent call last):   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 38, in <module>
    if __name__ == "__main__": main()   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 31, in main
    print SFDCDropboxUploadDownload().SFDCDropboxSync(lst)   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 26, in SFDCDropboxSync
    pkl = self.SaveListtoPickle(lst)   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 20, in SaveListtoPickle
    pickle.dump(lst,open(f,'wb')) TypeError: coercing to Unicode: need string or buffer, instance found [Finished in 0.7s with exit code 1] [shell_cmd: python -u "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py"] [dir: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump] [path: /usr/bin:/bin:/usr/sbin:/sbin]

【问题讨论】:

您是否尝试在没有b 标志的情况下进行转储? pickle.dump(lst,open(f,'w')) 程序和回溯不匹配......但看起来数据(或 lst?)不是一个可挑选的对象。那么,你传递了什么? 【参考方案1】:

在您的代码中,NamedTemporaryFile f 不是字符串。是一个文件对象,类似于open(file_path)的输出。

来自documentation:这个类文件对象可以在 with 语句中使用,就像普通文件一样。

如果要创建文件的路径,请使用 tmp_file.name

例如,这有效:(在 python 3.6.2 上测试)

def SFDCDropboxSync(Data):
    with tempfile.NamedTemporaryFile() as tmp_file:
        pickle.dump(Data, tmp_file)
        tmp_file.flush()

        print(pickle.load(open(tmp_file.name, 'rb')))

这将在文件退出时删除文件(文件关闭)。

Windows 警告:文件打开时您可能无法读取文件。相反,使用类似的东西:

with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
    pickle.dump(Data, open(tmp_file.name, 'wb'))
    tmp_filename = tmp_file.name

pickle.load(open(tmp_filename, 'rb'))
os.remove(tmp_filename)

【讨论】:

使用 file.seek(0) 你可以使用一个普通的临时文件,我猜它比重新打开文件要快 这会在文件退出with时删除文件。 @user39430 你可能错过了delete=False

以上是关于如何将列表保存到临时目录中的泡菜文件并将该文件传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件保存到无临时目录并查看该目录中文件的内容?

如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?

uniapp如何将沙盒里的文件移到系统文件

如何获取保存在临时目录中的视频的 url

将 DAO QueryDef 保存到临时查询并将结果输出到 Excel

如何覆盖图库中的图像