# Linux中如何使用Python對圖片進行批量命名
## 前言
在日常工作和生活中,我們經常需要處理大量的圖片文件。這些圖片可能來自相機、手機截圖或網絡下載,文件名往往雜亂無章(如`IMG_20230101_123456.jpg`或`DSC0001.jpg`)。本文將詳細介紹如何在Linux系統中使用Python腳本對圖片進行批量重命名,實現文件管理的自動化。
## 準備工作
### 1. 環境要求
- Linux操作系統(Ubuntu/CentOS等)
- Python 3.x環境
- Pillow庫(用于圖像處理)
- 基本的終端操作能力
### 2. 安裝必要組件
```bash
# 安裝Python3(如未安裝)
sudo apt-get install python3
# 安裝Pillow庫
pip3 install Pillow
# 安裝exifread(用于讀取EXIF信息)
pip3 install exifread
import os
def batch_rename(folder_path, prefix):
"""基礎批量重命名函數"""
for index, filename in enumerate(os.listdir(folder_path)):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
# 獲取文件擴展名
ext = os.path.splitext(filename)[1]
# 新文件名格式:前綴_序號.擴展名
new_name = f"{prefix}_{index+1:03d}{ext}"
# 重命名操作
os.rename(
os.path.join(folder_path, filename),
os.path.join(folder_path, new_name)
)
print(f"Renamed {filename} to {new_name}")
# 使用示例
batch_rename("/path/to/images", "vacation")
from datetime import datetime
def rename_with_date(folder_path):
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
# 獲取當前時間
now = datetime.now().strftime("%Y%m%d_%H%M%S")
ext = os.path.splitext(filename)[1]
new_name = f"photo_{now}_{os.urandom(2).hex()}{ext}"
os.rename(
os.path.join(folder_path, filename),
os.path.join(folder_path, new_name)
)
import exifread
def get_exif_date(image_path):
"""獲取照片拍攝日期"""
with open(image_path, 'rb') as f:
tags = exifread.process_file(f)
if 'EXIF DateTimeOriginal' in tags:
return str(tags['EXIF DateTimeOriginal'])
return None
def exif_based_rename(folder_path):
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
filepath = os.path.join(folder_path, filename)
ext = os.path.splitext(filename)[1]
# 嘗試獲取EXIF日期
exif_date = get_exif_date(filepath)
if exif_date:
# 格式化日期:2023:01:01 12:34:56 → 20230101_123456
clean_date = exif_date.replace(':', '').replace(' ', '_')
new_name = f"{clean_date}{ext}"
else:
# 使用文件修改日期作為后備方案
mtime = os.path.getmtime(filepath)
clean_date = datetime.fromtimestamp(mtime).strftime("%Y%m%d_%H%M%S")
new_name = f"noexif_{clean_date}{ext}"
os.rename(filepath, os.path.join(folder_path, new_name))
from PIL import Image
def categorize_by_color(image_path):
"""通過主色調簡單分類圖片"""
img = Image.open(image_path)
img = img.convert('RGB')
# 獲取主要顏色(簡化版)
colors = img.getcolors(maxcolors=10000)
if not colors:
return "other"
main_color = max(colors, key=lambda x: x[0])[1]
if main_color[0] > 200 and main_color[1] < 50 and main_color[2] < 50:
return "red"
elif main_color[1] > 200 and main_color[0] < 50 and main_color[2] < 50:
return "green"
else:
return "other"
def content_based_rename(folder_path):
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
filepath = os.path.join(folder_path, filename)
ext = os.path.splitext(filename)[1]
category = categorize_by_color(filepath)
mtime = os.path.getmtime(filepath)
clean_date = datetime.fromtimestamp(mtime).strftime("%Y%m%d")
new_name = f"{category}_{clean_date}_{os.urandom(2).hex()}{ext}"
os.rename(filepath, os.path.join(folder_path, new_name))
from geopy.geocoders import Nominatim
def get_location_from_gps(gps_info):
"""將GPS坐標轉換為地理位置名稱"""
if not gps_info:
return None
try:
geolocator = Nominatim(user_agent="image_renamer")
location = geolocator.reverse(f"{gps_info[0]}, {gps_info[1]}")
return location.address.split(',')[0]
except:
return None
#!/usr/bin/env python3
"""
圖片批量重命名工具
功能:
1. 支持按EXIF日期重命名
2. 支持按修改日期重命名
3. 支持自定義前綴
4. 支持序列號填充
"""
import os
import argparse
from datetime import datetime
import exifread
from PIL import Image
def main():
parser = argparse.ArgumentParser()
parser.add_argument("folder", help="圖片目錄路徑")
parser.add_argument("--prefix", default="img", help="文件名前綴")
parser.add_argument("--digits", type=int, default=4, help="序號位數")
args = parser.parse_args()
for index, filename in enumerate(sorted(os.listdir(args.folder))):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
filepath = os.path.join(args.folder, filename)
ext = os.path.splitext(filename)[1].lower()
# 嘗試獲取EXIF日期
exif_date = get_exif_date(filepath)
if exif_date:
date_part = exif_date.replace(':', '').replace(' ', '_')
else:
mtime = os.path.getmtime(filepath)
date_part = datetime.fromtimestamp(mtime).strftime("%Y%m%d")
# 生成新文件名
new_name = f"{args.prefix}_{date_part}_{index+1:0{args.digits}d}{ext}"
# 執行重命名
os.rename(filepath, os.path.join(args.folder, new_name))
print(f"Renamed {filename} → {new_name}")
if __name__ == "__main__":
main()
/ \ : * ? " < > |
等特殊字符通過Python腳本實現圖片批量重命名,不僅可以提高工作效率,還能建立規范的文件管理體系。本文介紹的方法可以根據實際需求進行組合和擴展,例如添加人臉識別分類、自動生成縮略圖等功能。掌握這些自動化技巧,將讓你在Linux環境下的圖片管理工作事半功倍。 “`
這篇文章共計約1750字,涵蓋了從基礎到高級的多種圖片批量命名方案,并提供了可直接運行的代碼示例。所有腳本都針對Linux環境進行了優化,可以根據實際需求進行修改和擴展。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。