You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python从文件夹获取文件并存储至MongoDB数据库?

如何将指定类型文件存储到MongoDB?

嘿,这个需求我刚好实操过,给你梳理下具体的实现步骤,分分钟就能搞定:

1. 先准备依赖

首先得安装MongoDB的Python驱动pymongo,直接用pip装就行:

pip install pymongo

如果要处理大文件(超过16MB),还需要用到GridFS,不过pymongo已经包含这个模块了,不用额外安装。

2. 筛选目标文件

你已经用os.listdir拿到了文件夹里的所有文件,接下来要过滤出.jpeg、.png、.txt、.csv这些类型的文件。这里建议统一转成小写后缀,避免大小写问题(比如.JPEG和.jpeg都能匹配到):

import os

dir_loc = "/your/target/folder/path"  # 替换成你的文件夹路径
allowed_extensions = ('.jpeg', '.png', '.txt', '.csv')

# 筛选符合条件的文件
target_files = [
    file for file in os.listdir(dir_loc)
    if file.lower().endswith(allowed_extensions)
]

3. 连接MongoDB

接下来建立和MongoDB的连接,这里以本地默认端口为例,如果是远程数据库,记得替换成你的连接字符串(包含用户名、密码、地址等):

from pymongo import MongoClient

# 本地连接示例,远程的话改成类似'mongodb://user:password@host:port/'
client = MongoClient('mongodb://localhost:27017/')
db = client['file_storage']  # 自定义数据库名
collection = db['uploaded_files']  # 自定义集合名

4. 读取文件并存储到MongoDB

这里要区分文本文件和二进制文件(图片),存储方式不一样:

  • 文本文件(.txt、.csv)可以直接存字符串
  • 图片文件(.jpeg、.png)需要用bson.binary.Binary包装成二进制数据存入

代码示例如下:

from bson.binary import Binary

for filename in target_files:
    file_full_path = os.path.join(dir_loc, filename)
    file_ext = os.path.splitext(filename)[1].lower()
    
    # 处理文本文件
    if file_ext in ('.txt', '.csv'):
        try:
            with open(file_full_path, 'r', encoding='utf-8') as f:
                content = f.read()
            file_data = {
                'filename': filename,
                'extension': file_ext,
                'file_type': 'text',
                'content': content
            }
        except UnicodeDecodeError:
            # 遇到编码问题时的 fallback 处理
            with open(file_full_path, 'r', encoding='utf-8', errors='ignore') as f:
                content = f.read()
            file_data = {
                'filename': filename,
                'extension': file_ext,
                'file_type': 'text',
                'content': content,
                'note': '文件编码存在问题,已忽略错误字符'
            }
    # 处理图片文件
    elif file_ext in ('.jpeg', '.png'):
        with open(file_full_path, 'rb') as f:
            content = Binary(f.read())
        file_data = {
            'filename': filename,
            'extension': file_ext,
            'file_type': 'image',
            'content': content
        }
    
    # 插入到MongoDB集合
    collection.insert_one(file_data)
    print(f"✅ 成功上传文件: {filename}")

5. 处理大文件的特殊情况

如果你的文件超过MongoDB单文档16MB的限制,就需要用GridFS来存储,它会自动把大文件拆分成多个小chunk存储,读取的时候再合并回来。示例代码:

from gridfs import GridFS
import datetime

# 初始化GridFS
fs = GridFS(db)

for filename in target_files:
    file_full_path = os.path.join(dir_loc, filename)
    file_ext = os.path.splitext(filename)[1].lower()
    
    with open(file_full_path, 'rb') as f:
        # 存储文件,同时附加文件名、后缀等元数据
        fs.put(
            f,
            filename=filename,
            extension=file_ext,
            upload_time=datetime.datetime.now()  # 可以加更多自定义元数据
        )
    print(f"✅ 用GridFS成功上传文件: {filename}")

一些小提示

  • 记得替换代码里的文件夹路径、数据库名、集合名成你自己的
  • 远程MongoDB连接要注意权限配置,确保你的客户端有写入权限
  • 文本文件的编码问题很常见,如果遇到解码错误,可以先排查文件实际编码(比如GBK),再调整open方法里的encoding参数

内容的提问来源于stack exchange,提问作者TheProfiler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:13:37