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

0 投票
1 回答
4622 浏览
提问于 2025-04-18 04:19

问题是我从一个地方获取数据,然后想把它保存到Dropbox,格式是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]

1 个回答

2

在你的代码中,NamedTemporaryFile f 不是一个字符串。它是一个文件对象,类似于你用 open(file_path) 打开的文件。

根据文档:这个像文件一样的对象可以像普通文件一样在 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')))

当退出 while 循环时,这个文件会被删除(文件会关闭)。

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)

撰写回答