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
相关产品推荐
相关产品推荐

