***MJ新工作流

不上火星不改名發表於2024-06-07
1.(去下劃線)我有一個資料夾,遍歷其中所有圖片檔名稱,請刪除所有圖片第一個下劃線以及第一個下劃線之前的內容。
import os

def rename_images(directory):
    # 遍歷目錄中的所有檔案
    for filename in os.listdir(directory):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
            # 找到第一個下劃線的位置
            underscore_index = filename.find('_')
            if underscore_index != -1:
                # 生成新的檔名
                new_filename = filename[underscore_index + 1:]
                # 構造完整的檔案路徑
                old_file = os.path.join(directory, filename)
                new_file = os.path.join(directory, new_filename)
                # 重新命名檔案
                os.rename(old_file, new_file)
                print(f"Renamed '{filename}' to '{new_filename}'")

# 使用者輸入資料夾地址
folder_path = input("請輸入資料夾的完整路徑: ")
rename_images(folder_path)

2.(只留25個英文字元)我有一個資料夾,裡面有很多圖片,請 每次啟動程式詢問資料夾地址。 1.(保持副檔名)只保留圖片名稱中的英文,刪去所有空格與特殊標點與中文。 2.從第一個英文字元開始,只保留每張圖片名中的前25個英文字元,並全部轉換成小寫英文字母,並用這25個字元重新命名圖片。遇到有重複的英文名稱則加字尾(1),(2),(3)等。

import os
import re

def sanitize_filename(filename):
    """只保留英文字元,並刪除空格與特殊標點"""
    return re.sub('[^A-Za-z]+', '', filename)

def main():
    folder_path = input("請輸入資料夾地址: ")
    if not os.path.isdir(folder_path):
        print("提供的地址不是一個有效的資料夾!")
        return

    filenames = os.listdir(folder_path)
    new_names = {}
    for filename in filenames:
        file_ext = os.path.splitext(filename)[1]
        if file_ext.lower() not in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']:
            continue
        
        # 清理並擷取前25個字元
        clean_name = sanitize_filename(filename)[:25].lower()
        
        # 處理可能的重名
        original_clean_name = clean_name
        counter = 1
        new_file_path = os.path.join(folder_path, clean_name + file_ext)
        while clean_name in new_names.values() or os.path.exists(new_file_path):
            clean_name = f"{original_clean_name}({counter})"
            new_file_path = os.path.join(folder_path, clean_name + file_ext)
            counter += 1
        
        # 嘗試重新命名,處理可能的錯誤
        try:
            os.rename(os.path.join(folder_path, filename), new_file_path)
            new_names[filename] = clean_name + file_ext
        except OSError as e:
            print(f"無法重新命名檔案 {filename} 到 {new_file_path}: {e}")

    print("檔案重新命名完成。")

if __name__ == "__main__":
    main()

3.(excel表內操作)我有一張excel表格,請把第一列的資訊只保留英文字元,並刪除所有空格標點和中文,然後羅列在第三列,完成後每個單元格保留前25個字元。告訴我公式的操作方式。

=LEFT(TEXTJOIN("", TRUE, IF(ISNUMBER(FIND(MID(SUBSTITUTE(A2, " ", ""), ROW(INDIRECT("1:" & LEN(SUBSTITUTE(A2, " ", "")))), 1), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")), MID(SUBSTITUTE(A2, " ", ""), ROW(INDIRECT("1:" & LEN(SUBSTITUTE(A2, " ", "")))), 1), "")), 25)

4.給我一個python指令碼,每次啟動程式,要求使用者輸入一個原資料夾地址,一個目標資料夾地址,一個excel表格地址,一個以及一個輸入列序號X,一個命名列序號Y,一個txt參考列號Z 我有一個資料夾,裡面有很多圖片,請針對每張圖片名稱,在excel表格從左向右第X列(輸入列)的單元格中找到與圖片名稱前25個英文字元相同的單元格,然後在同一行從左向右第Y列(命名列)的單元格中讀取資訊並在目標資料夾地址下用命名列的資訊建立一個資料夾(如果已有同樣名稱的資料夾則不用建立,直接移動即可)。將該圖片移動到該資料夾內。全部圖片移動完成後,在目標地址每個新建的資料夾內建立一個txt文件,txt的名稱為所在資料夾名稱,txt的內部資訊根據”txt參考列號Z“在excel表格的第Z列讀取資訊並輸入txt內部(根據Y列匹配資料夾名稱並讀取同一行的Z列資訊)。

import os
import shutil
import pandas as pd

def main():
    try:
        # 獲取使用者輸入
        source_dir = input("請輸入原資料夾地址: ")
        target_dir = input("請輸入目標資料夾地址: ")
        excel_path = input("請輸入Excel表格地址: ")
        input_col_index = int(input("請輸入輸入列序號X: ")) - 1  # 從0開始索引
        name_col_index = int(input("請輸入命名列序號Y: ")) - 1
        txt_col_index = int(input("請輸入txt參考列號Z: ")) - 1
        
        # 檢查目錄有效性
        if not os.path.exists(source_dir):
            raise Exception(f"原始檔夾地址無效:{source_dir}")
        if not os.path.exists(target_dir):
            os.makedirs(target_dir)
        if not os.path.exists(excel_path):
            raise Exception(f"Excel檔案地址無效:{excel_path}")

        # 讀取Excel檔案
        df = pd.read_excel(excel_path)
        if df.columns.size <= max(input_col_index, name_col_index, txt_col_index):
            raise Exception("列號超出Excel表格範圍")

        # 遍歷原始檔夾中的所有圖片
        for filename in os.listdir(source_dir):
            if filename.lower().endswith((".png", ".jpg", ".jpeg")):  # 根據需要可以新增更多圖片格式
                # 獲取圖片檔名的前25個英文字母
                clean_name = ''.join([c for c in filename if c.isalpha()])[:25]
                
                # 查詢Excel中匹配的行
                match = df[df.iloc[:, input_col_index].astype(str).str.startswith(clean_name)]
                if not match.empty:
                    # 獲取目標資料夾名
                    folder_name = match.iloc[0, name_col_index]
                    folder_path = os.path.join(target_dir, folder_name)
                    
                    # 如果目標資料夾不存在,則建立
                    if not os.path.exists(folder_path):
                        os.makedirs(folder_path)
                    
                    # 移動圖片到目標資料夾
                    shutil.move(os.path.join(source_dir, filename), os.path.join(folder_path, filename))
                    
                    # 如果txt檔案不存在,建立並寫入資訊
                    txt_path = os.path.join(folder_path, folder_name + '.txt')
                    if not os.path.exists(txt_path):
                        with open(txt_path, 'w') as txt_file:
                            txt_file.write(str(match.iloc[0, txt_col_index]))
    except Exception as e:
        print(f"發生錯誤:{e}")

if __name__ == "__main__":
    main()

相關文章