如何使用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
相关产品推荐
相关产品推荐

