基于HTML索引实现多媒体按日期浏览及批量整理需求问询
没问题!针对你的两个需求,我分别给你整理了实用的方案:
方案一:生成本地HTML索引按日期查看所有媒体文件
这个方案用Python脚本自动遍历你的所有文件夹,提取每个媒体文件的拍摄/修改日期,生成一个按日期排序的HTML页面——你不需要手动写任何文件路径,脚本全搞定,而且本地打开就能用,完全不用对外部署。
操作步骤:
- 先安装需要的依赖库(打开终端/命令提示符执行):
pip install pillow exifread
- 复制下面的脚本,保存为
generate_media_index.py:
import os from datetime import datetime from PIL import Image import exifread # 替换成你的硬盘根文件夹路径 ROOT_FOLDER = "D:/Photos" # 支持的媒体文件格式,可按需添加 SUPPORTED_FORMATS = ('.jpg', '.jpeg', '.png', '.gif', '.mp4', '.mov', '.avi', '.mkv') def get_media_date(file_path): # 优先获取图片的EXIF拍摄日期 if file_path.lower().endswith(('.jpg', '.jpeg', '.png')): try: with open(file_path, 'rb') as f: tags = exifread.process_file(f, details=False) if 'EXIF DateTimeOriginal' in tags: date_str = str(tags['EXIF DateTimeOriginal']) return datetime.strptime(date_str, '%Y:%m:%d %H:%M:%S') except Exception: pass # 没有EXIF信息时,用文件修改时间代替 return datetime.fromtimestamp(os.path.getmtime(file_path)) def generate_html(media_files): # 按日期倒序排列(最新的在最前面) sorted_files = sorted(media_files, key=lambda x: x[1], reverse=True) html_content = """ <!DOCTYPE html> <html> <head> <title>媒体文件按日期索引</title> <style> body { max-width: 1400px; margin: 0 auto; padding: 20px; font-family: Arial, sans-serif; } .media-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 15px; } .media-item { text-align: center; border-radius: 4px; overflow: hidden; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .media-item img, .media-item video { width: 100%; height: 150px; object-fit: cover; } .date-label { font-size: 12px; color: #666; padding: 5px 0; } </style> </head> <body> <h1>所有媒体文件按日期排序</h1> <div class="media-grid"> """ for file_path, date in sorted_files: relative_path = os.path.relpath(file_path, ROOT_FOLDER) date_str = date.strftime('%Y-%m-%d %H:%M:%S') filename = os.path.basename(file_path) if file_path.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')): html_content += f""" <div class="media-item"> <a href="{relative_path}" target="_blank" title="{filename}"> <img src="{relative_path}" alt="{filename}"> </a> <div class="date-label">{date_str}</div> </div> """ else: # 视频文件直接嵌入预览,点击可打开原文件 html_content += f""" <div class="media-item"> <a href="{relative_path}" target="_blank" title="{filename}"> <video controls poster="" width="100%" height="150px"> <source src="{relative_path}" type="video/mp4"> 你的浏览器不支持视频播放 </video> </a> <div class="date-label">{date_str}</div> </div> """ html_content += """ </div> </body> </html> """ # 把HTML文件保存到根文件夹 index_path = os.path.join(ROOT_FOLDER, "media_index.html") with open(index_path, 'w', encoding='utf-8') as f: f.write(html_content) print(f"索引文件已生成:{index_path}") def main(): media_files = [] # 遍历所有子文件夹,收集媒体文件 for root, dirs, files in os.walk(ROOT_FOLDER): for file in files: if file.lower().endswith(SUPPORTED_FORMATS): file_path = os.path.join(root, file) media_date = get_media_date(file_path) media_files.append((file_path, media_date)) generate_html(media_files) if __name__ == "__main__": main()
- 修改脚本里的
ROOT_FOLDER为你的硬盘实际路径,运行脚本:
python generate_media_index.py
- 打开根文件夹里生成的
media_index.html,就能看到按日期排序的所有照片/视频了,点击可直接查看原文件。
方案二:批量迁移嵌套文件夹中的媒体文件到单个文件夹
如果生成HTML索引不符合你的预期,直接把所有文件迁移到单个文件夹也是个简单的办法,我给你准备了不同系统的命令行方法,自动处理重名文件:
Windows(PowerShell):
# 替换为你的源文件夹和目标文件夹路径 $source = "D:\Photos" $target = "D:\AllMedia" # 创建目标文件夹(如果不存在) New-Item -ItemType Directory -Force -Path $target # 遍历所有媒体文件,复制到目标文件夹,重名文件自动加数字后缀 Get-ChildItem -Path $source -Recurse -File -Include *.jpg,*.jpeg,*.png,*.gif,*.mp4,*.mov,*.avi,*.mkv | ForEach-Object { $destPath = Join-Path $target $_.Name $counter = 1 while (Test-Path $destPath) { $destPath = Join-Path $target "$($_.BaseName)_$counter$($_.Extension)" $counter++ } Copy-Item $_.FullName -Destination $destPath }
Linux/macOS(终端):
# 替换为你的源文件夹和目标文件夹路径 source="/mnt/Photos" target="/mnt/AllMedia" # 创建目标文件夹(如果不存在) mkdir -p "$target" # 遍历复制媒体文件,重名文件自动加数字后缀 find "$source" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.mp4" -o -iname "*.mov" -o -iname "*.avi" -o -iname "*.mkv" \) | while read file; do filename=$(basename "$file") dest="$target/$filename" counter=1 while [ -f "$dest" ]; do dest="$target/$(basename "$file" .${filename##*.})_$counter.${filename##*.}" counter=$((counter+1)) done cp "$file" "$dest" done
注意:迁移前建议先备份重要文件,避免意外情况。
内容的提问来源于stack exchange,提问作者SugarTe
相关产品推荐
相关产品推荐

