【问题标题】:MongoDB GridFS Python download_to_stream_by_name throws 'unicode' object has no attribute 'write'MongoDB GridFS Python download_to_stream_by_name 抛出“unicode”对象没有属性“write”
【发布时间】:2017-11-19 18:30:27
【问题描述】:

当使用 MongoDB 的 PyMongo 驱动程序时,我可以使用 bucket.upload_from_stream(filename, address) 成功地将图像上传到 GridFS。它非常简单,没有任何复杂性。 但是当我尝试使用bucket.download_to_stream_by_name(filename, address) 检索相同的数据时,将第二个参数作为目标,它会引发错误:

AttributeError: 'unicode' object has no attribute 'write'

为什么会这样?如何设置要保存文件的位置?

【问题讨论】:

  • @Rawing 我确实多次阅读了文档,但对于类文件对象应该是什么完全没有说明。类似文件的对象,就像在文档示例中一样,没有提供任何指定存储位置的机会,即使参数称为“目标”。

标签: python mongodb pymongo gridfs


【解决方案1】:

以下是使用 download_to_stream_by_name 并在磁盘目录中创建文件的示例:

import os
from pymongo import MongoClient
from gridfs import GridFSBucket

my_db = MongoClient().test
fs = GridFSBucket(my_db)
file_id = fs.upload_from_stream(
    "test_file",
    "data I want to store!",
    chunk_size_bytes=4,
    metadata={"contentType": "text/plain"})

fs = GridFSBucket(my_db)
# Get file to write to
if not os.path.exists('my_directory'):
    os.makedirs('my_directory')

file = open('my_directory/myfile','wb')
fs.download_to_stream_by_name("test_file", file)

“类文件对象”是具有“写入”方法的对象,该方法需要写入大量字符。由“open”函数创建的实际文件对象是类文件对象的一种可能性。

注意,传递给 download_to_stream_by_name 的文件名是 GridFS 中的文件名,而不是磁盘上的文件名。

【讨论】:

  • 感谢您的回答@A。 Jesse Jirya Davis,但我的问题不完全是下载,而是指定下载目录。我可以在Node.js中指定下载目录,但是我无法在这个里面配置。
  • 我已经更新了我的答案以展示如何创建目录。
  • @A.JesseJiryuDavis 你知道如何在 cmd 中指定存储桶名称:fs = GridFSBucket(my_db) 吗?
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多