溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux中如何使用Python對圖片進行批量命名

發布時間:2021-12-29 10:26:49 來源:億速云 閱讀:227 作者:小新 欄目:開發技術
# 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

一、基礎批量重命名方法

1. 使用os模塊實現簡單重命名

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")

2. 添加日期時間信息

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)
            )

二、基于EXIF信息的智能命名

1. 讀取照片元數據

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

2. 實現EXIF命名

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))

三、高級命名方案

1. 按內容分類命名

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))

2. 結合GPS信息命名(需安裝geopy)

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()

五、使用建議

  1. 備份原始文件:建議先復制圖片到新目錄再進行重命名
  2. 測試運行:可以先打印新文件名而不實際執行重命名
  3. 處理特殊字符:文件名中避免使用/ \ : * ? " < > |等特殊字符
  4. 大文件處理:對于大量文件,可以考慮分批處理

結語

通過Python腳本實現圖片批量重命名,不僅可以提高工作效率,還能建立規范的文件管理體系。本文介紹的方法可以根據實際需求進行組合和擴展,例如添加人臉識別分類、自動生成縮略圖等功能。掌握這些自動化技巧,將讓你在Linux環境下的圖片管理工作事半功倍。 “`

這篇文章共計約1750字,涵蓋了從基礎到高級的多種圖片批量命名方案,并提供了可直接運行的代碼示例。所有腳本都針對Linux環境進行了優化,可以根據實際需求進行修改和擴展。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女