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

Python脚本开发:指定目录文件存入SQLite并生成MD5等元信息

完善后的Python脚本实现

以下是满足需求的完整解决方案,修复原代码问题并添加所需功能:

完整代码

import sqlite3
import os
import hashlib
import pandas as pd
from datetime import datetime

def calculate_md5(file_path, chunk_size=4096):
    """计算文件MD5哈希值,分块读取避免内存溢出"""
    md5 = hashlib.md5()
    with open(file_path, 'rb') as f:
        while chunk := f.read(chunk_size):
            md5.update(chunk)
    return md5.hexdigest()

def get_creation_time(file_path):
    """跨平台获取文件创建时间,兼容Unix/Windows"""
    try:
        # Unix系统优先取出生时间
        stat_info = os.stat(file_path)
        creation_time = stat_info.st_birthtime
    except AttributeError:
        # 不支持st_birthtime的系统用状态变更时间替代
        creation_time = os.path.getctime(file_path)
    return datetime.fromtimestamp(creation_time).strftime('%Y-%m-%d %H:%M:%S')

# 指定目标目录
directory = "/unixhomes003/Desktop/"

# 连接SQLite数据库
conn = sqlite3.connect("dbfile1.db")
cur = conn.cursor()

# 创建包含所有所需字段的数据表
cur.execute("""
CREATE TABLE IF NOT EXISTS file_metadata (
    filename TEXT,
    source_dir TEXT,
    create_date TEXT,
    md5_hash TEXT,
    PRIMARY KEY (filename, source_dir)
)
""")

# 遍历目录收集元数据并插入数据库
for root, _, filenames in os.walk(directory):
    for filename in filenames:
        file_path = os.path.join(root, filename)
        # 跳过子目录,只处理文件
        if not os.path.isfile(file_path):
            continue
        # 获取文件元数据
        source_dir = root
        create_date = get_creation_time(file_path)
        md5_hash = calculate_md5(file_path)
        # 插入数据,主键避免重复条目
        cur.execute("""
        INSERT OR IGNORE INTO file_metadata 
        (filename, source_dir, create_date, md5_hash)
        VALUES (?, ?, ?, ?)
        """, (filename, source_dir, create_date, md5_hash))
conn.commit()

# 读取数据到DataFrame并打印
df = pd.read_sql_query("SELECT * FROM file_metadata", conn)
print(df)

# 关闭数据库连接
conn.close()

关键改进说明

  • 扩展表结构:新增source_dir(文件所在目录)、create_date(创建时间)、md5_hash(MD5值)字段,用filename+source_dir作为主键防止重复插入同一文件
  • MD5计算优化:分块读取文件计算MD5,适配大文件场景
  • 跨平台时间兼容:处理不同系统的文件创建时间获取逻辑,避免报错
  • 修正原代码错误:修复了DataFrame列名拼写错误(filname→filename),移除无意义的文件过滤条件
  • 数据去重机制:通过INSERT OR IGNORE和主键约束,避免重复数据

按创建日期查询示例

如需按时间范围查询文件列表,可执行以下SQL语句:

SELECT * FROM file_metadata 
WHERE create_date BETWEEN '2024-01-01 00:00:00' AND '2024-06-01 23:59:59'
ORDER BY create_date DESC;

用Pandas执行查询的代码:

query = """
SELECT * FROM file_metadata 
WHERE create_date BETWEEN ? AND ?
ORDER BY create_date DESC;
"""
filtered_df = pd.read_sql_query(query, conn, params=('2024-01-01 00:00:00', '2024-06-01 23:59:59'))
print(filtered_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:35:15