1.【Xóa văn bản lỗi và thêm nhãn】Xóa tiền tố (tên người dùng), xóa hậu tố (văn bản lỗi), thêm nhãn thống nhất, và mở Excel để điều chỉnh chi tiết. (Đầu vào: 1. Địa chỉ thư mục đơn 2. Tên nhãn cần thêm vào thư mục)
*Lưu ý: Nếu muốn thêm nhiều nhãn, hãy dùng dấu phẩy tiếng Anh "," để ngăn cách.
import os
import openpyxl
import re
CAC_TU_CAN_XOA = ["undefined", "皮皮", "zly324"]
# Bước 1: Đổi tên tệp
doi_ten_tep(duong_dan):
tep = [f for f in os.listdir(duong_dan) if os.path.isfile(os.path.join(duong_dan, f))]
tep_da_doi_ten = []
dem = 1
for tep in tep:
ten_tep, mo_rong = os.path.splitext(tep)
# Văn bản lỗi
if re.search(r'[a-f0-9]{32}', ten_tep) or not '_' in ten_tep:
ten_moi = f"({dem})"
dem += 1
# Hình ảnh do AI tạo
else:
phan = re.split(r'[_]+', ten_tep)
phan.pop(0) # Xóa phần tử đầu tiên
# Xóa các phần tử cụ thể
phan = [phan for phan in phan if phan not in CAC_TU_CAN_XOA]
# Xóa tất cả các phần tử chứa số
phan = [phan for phan in phan if not any(char.isdigit() for char in phan)]
# Quy tắc kết thúc
# Xóa số theo định dạng UUID
while phan and re.search(r'^[a-f0-9\-]{32,}$', phan[-1]):
phan.pop(-1)
# Xóa các phần có độ dài nhỏ hơn hoặc bằng 4
while phan and len(phan[-1]) <= 4:
phan.pop(-1)
ten_moi = '_'.join(phan)
tep_da_doi_ten.append(ten_moi + mo_rong)
return tep_da_doi_ten
# Bước 2: Thêm tiền tố
them_tien_tep(tep, tien_tu):
tep_co_tien_tu = [f"{tien_tu}_{tep}" if not tep.startswith(tien_tu) else tep for tep in tep]
# Xóa các phần tử cụ thể
tep_co_tien_tu = ['_'.join([phan for phan in re.split(r'[_]+', ten) if phan not in CAC_TU_CAN_XOA]) for ten in
tep_co_tien_tu]
return tep_co_tien_tu
# Bước 3: Tạo Excel và tự động mở
tao_mo_excel(tep, tep_da_doi_ten, duong_dan):
wb = openpyxl.Workbook()
ws = wb.active
for goc, da_doi_ten in zip(tep, tep_da_doi_ten):
ws.append([goc, da_doi_ten])
duong_dan_excel = os.path.join(duong_dan, os.path.basename(duong_dan) + ".xlsx")
wb.save(duong_dan_excel)
# Mở tệp Excel
os.system(f'start "" "{duong_dan_excel}"')
return duong_dan_excel
# Bước 5: Đọc Excel và đổi tên tệp
doi_ten_tep_tu_excel(duong_dan, duong_dan_excel):
wb = openpyxl.load_workbook(duong_dan_excel)
ws = wb.active
for hang in ws.iter_rows(values_only=True):
ten_goc, ten_moi = hang
duong_dan_muc_tieu = os.path.join(duong_dan, ten_moi)
# Kiểm tra tệp gốc có tồn tại không
if os.path.exists(os.path.join(duong_dan, ten_goc)):
# Nếu tên tệp đích đã tồn tại, thêm số
dem = 1
ten_co_so, mo_rong = os.path.splitext(ten_moi)
while os.path.exists(duong_dan_muc_tieu):
ten_moi = f"{ten_co_so} ({dem}){mo_rong}"
duong_dan_muc_tieu = os.path.join(duong_dan, ten_moi)
dem += 1
os.rename(os.path.join(duong_dan, ten_goc), duong_dan_muc_tieu)
print("Hoàn thành đổi tên.")
# Hàm chính
def main():
duong_dan = input("Vui lòng nhập địa chỉ thư mục: ")
tep = [f for f in os.listdir(duong_dan) if os.path.isfile(os.path.join(duong_dan, f))]
tep_da_doi_ten = doi_ten_tep(duong_dan)
tien_tu = input("Vui lòng nhập từ cần đặt tên hàng loạt: ")
tep_co_tien_tu = them_tien_tep(tep_da_doi_ten, tien_tu)
duong_dan_excel = tao_mo_excel(tep, tep_co_tien_tu, duong_dan)
print(f"Tệp Excel đã được lưu là: {duong_dan_excel}")
print("Vui lòng điều chỉnh dữ liệu cột B trong Excel, sau đó lưu và đóng tệp Excel. Hoàn thành nhấn Enter để tiếp tục...")
input()
# Đổi tên tệp
doi_ten_tep_tu_excel(duong_dan, duong_dan_excel)
if __name__ == "__main__":
main()
2.【Xử lý dấu gạch dưới】Giữ lại chỉ dấu gạch dưới đầu tiên, xóa các dấu gạch dưới sau (Đầu vào: Địa chỉ tổng)
import os
import shutil
class XuLyThuMuc:
def __init__(self, duong_dan_nguon, duong_dan_dich):
self.duong_dan_nguon = duong_dan_nguon
self.duong_dan_dich = duong_dan_dich
def sao_chep_thu_muc(self):
"""Sao chép thư mục nguồn đến thư mục đích."""
try:
shutil.copytree(self.duong_dan_nguon, self.duong_dan_dich)
except FileExistsError:
print(f"Thư mục sao lưu '{self.duong_dan_dich}' đã tồn tại.")
def doi_ten_hinh_anh(self):
"""Đổi tên tệp hình ảnh, giữ dấu gạch dưới đầu tiên, thay thế các dấu gạch dưới sau bằng dấu cách."""
for thu_muc_goc, thu_muc_con, tep in os.walk(self.duong_dan_dich):
for tep_hinh in tep:
if tep_hinh.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
# Tìm vị trí dấu gạch dưới đầu tiên
dau_gach_dau_tien = tep_hinh.find('_')
if dau_gach_dau_tien != -1:
# Giữ dấu gạch dưới đầu tiên, thay thế các dấu gạch dưới sau bằng dấu cách
truoc_dau_gach = tep_hinh[:dau_gach_dau_tien + 1]
sau_dau_gach = tep_hinh[dau_gach_dau_tien + 1:].replace('_', ' ')
ten_tep_moi = truoc_dau_gach + sau_dau_gach
else:
ten_tep_moi = tep_hinh
if ten_tep_moi != tep_hinh:
duong_dan_goc = os.path.join(thu_muc_goc, tep_hinh)
duong_dan_moi = os.path.join(thu_muc_goc, ten_tep_moi)
tang_bien = 1
# Lặp lại cho đến khi tìm tên tệp không xung đột
while os.path.exists(duong_dan_moi):
# Tách tên tệp và phần mở rộng
ten_tep, phan_mo_rong = os.path.splitext(ten_tep_moi)
# Thêm số tăng dần
ten_tep_moi = f"{ten_tep} ({tang_bien}){phan_mo_rong}"
duong_dan_moi = os.path.join(thu_muc_goc, ten_tep_moi)
tang_bien += 1
os.rename(duong_dan_goc, duong_dan_moi)
print(f"Tệp {duong_dan_goc} đã được đổi tên thành {duong_dan_moi}")
def main():
# Yêu cầu người dùng nhập đường dẫn thư mục cần xử lý
duong_dan_nhap = input("Vui lòng nhập đường dẫn thư mục cần xử lý: ")
# Kiểm tra thư mục có tồn tại không
if not os.path.exists(duong_dan_nhap):
print(f"Thư mục được chỉ định {duong_dan_nhap} không tồn tại.")
return
# Tạo thư mục sao lưu
duong_dan_sao_luu = os.path.join(duong_dan_nhap, "_backup")
print(f"Đang tạo thư mục sao lưu: {duong_dan_sao_luu}")
xu_ly = XuLyThuMuc(duong_dan_nhap, duong_dan_sao_luu)
xu_ly.sao_chep_thu_muc()
# Đổi tên tệp hình ảnh trong thư mục sao lưu
print("Đang đổi tên tệp hình ảnh trong thư mục sao lưu...")
xu_ly.doi_ten_hinh_anh()
print("Hoàn thành thao tác đổi tên.")
if __name__ == "__main__":
main()
3.【Chuyển dấu phẩy thành dấu gạch dưới】Trong thư mục lớn, chuyển tất cả dấu phẩy trong tên tệp hình ảnh thành dấu gạch dưới, phù hợp cho trường hợp nhập nhiều nhãn. (Đầu vào: Địa chỉ lớn)
import os
class BienDoiTenTep:
def __init__(self, duong_dan):
self.duong_dan = duong_dan
self.ten_tep_da_chinh_sua = []
self.dinh_dang_hinh_anh = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']
def thuc_hien_chuyen_doi(self):
"""Thực hiện chuyển đổi dấu phẩy thành dấu gạch dưới trong tên tệp hình ảnh."""
for thu_muc_goc, thu_muc_con, tep in os.walk(self.duong_dan):
for tep_hinh in tep:
if any(tep_hinh.endswith(dinh_dang) for dinh_dang in self.dinh_dang_hinh_anh):
# Thay thế dấu phẩy bằng dấu gạch dưới
ten_tep_moi = tep_hinh.replace(',', '_').replace(',', '_')
if ten_tep_moi != tep_hinh:
os.rename(os.path.join(thu_muc_goc, tep_hinh), os.path.join(thu_muc_goc, ten_tep_moi))
self.ten_tep_da_chinh_sua.append(os.path.join(thu_muc_goc, ten_tep_moi))
return self.ten_tep_da_chinh_sua
def main():
# Yêu cầu người dùng nhập đường dẫn thư mục
duong_dan = input("Vui lòng nhập đường dẫn thư mục: ")
bien_doi = BienDoiTenTep(duong_dan)
da_chinh_sua = bien_doi.thuc_hien_chuyen_doi()
print("Các tệp đã được chỉnh sửa:")
for f in da_chinh_sua:
print(f"Đã chỉnh sửa tệp: {f}")
if __name__ == "__main__":
main()
4.Bước 1-3 tham chiếu MJ chuyển huấn luyện mô hình lớn, điểm khác biệt là: cần tạo ảnh đối xứng trái phải (để tránh hình ảnh không đủ)
import os
from PIL import Image
class XuLyHinhAnh:
def __init__(self, thu_muc_xu_ly):
self.thu_muc_xu_ly = thu_muc_xu_ly
self.tong_tep = 0
self.da_xu_ly = 0
def tinh_tong_tep(self):
"""Tính tổng số tệp hình ảnh để hiển thị tiến độ."""
for thu_muc_goc, thu_muc_con, tep in os.walk(self.thu_muc_xu_ly):
for tep_hinh in tep:
if tep_hinh.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
self.tong_tep += 1
lat_anh(self, duong_dan_hinh_anh, duong_dan_xuat):
"""Lật hình ảnh theo chiều ngang và lưu bản sao với hậu tố."""
try:
with Image.open(duong_dan_hinh_anh) as img:
img_lat = img.transpose(Image.FLIP_LEFT_RIGHT)
img_lat.save(duong_dan_xuat)
return True
except Exception as e:
print(f"Không thể xử lý hình ảnh {duong_dan_hinh_anh}: {e}")
return False
def xu_ly_hinh_anh(self):
"""Xử lý tất cả hình ảnh trong thư mục và thư mục con."""
self.tinh_tong_tep()
for thu_muc_goc, thu_muc_con, tep in os.walk(self.thu_muc_xu_ly):
for tep_hinh in tep:
if tep_hinh.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
duong_dan_goc = os.path.join(thu_muc_goc, tep_hinh)
ten_tep, phan_mo_rong = os.path.splitext(tep_hinh)
duong_dan_xuat = os.path.join(thu_muc_goc, f"{ten_tep}(1){phan_mo_rong}")
if not os.path.exists(duong_dan_xuat): # Tránh ghi đè tệp đã tồn tại
if self.lat_anh(duong_dan_goc, duong_dan_xuat):
self.da_xu_ly += 1
# In tiến độ xử lý
print(f"Tiến độ xử lý: {self.da_xu_ly}/{self.tong_tep} ({(self.da_xu_ly/self.tong_tep)*100:.2f}%)")
def main():
duong_dan = input("Vui lòng nhập đường dẫn thư mục cần xử lý: ")
if os.path.exists(duong_dan) and os.path.isdir(duong_dan):
xu_ly = XuLyHinhAnh(duong_dan)
xu_ly.xu_ly_hinh_anh()
print("Hoàn thành xử lý hình ảnh.")
else:
print("Đường dẫn không hợp lệ hoặc không phải là thư mục.")
# Chạy script
main()
5.Tạo văn bản dựa trên tên tệp và loại bỏ các phần tử dư thừa, chỉ giữ lại mô tả
import os
import re
class TaoTepVanBan:
def __init__(self, thu_muc_goc):
self.thu_muc_goc = thu_muc_goc
self.tep_txt_da_tao = []
self.dau ngoac_pattern = re.compile(r'\(\d+\)')
self.dau_gach_duong = "_"
def tao_tep_tu_hinh_anh(self):
"""Tạo tệp văn bản từ tên tệp hình ảnh."""
if not os.path.exists(self.thu_muc_goc):
print("Đường dẫn không tồn tại, vui lòng kiểm tra lại.")
return
# Duyệt qua thư mục và tất cả thư mục con
for duong_dan, thu_muc, tep in os.walk(self.thu_muc_goc):
for tep_hinh in tep:
# Kiểm tra tệp có phải là hình ảnh không
if tep_hinh.endswith(('.jpg', '.png', '.jpeg')):
# Lấy tên tệp không có phần mở rộng
ten_co_so = os.path.splitext(tep_hinh)[0]
# Tạo đường dẫn tệp txt tương ứng
duong_dan_txt = os.path.join(duong_dan, ten_co_so + '.txt')
self.tep_txt_da_tao.append(duong_dan_txt)
# Ghi tên tệp (không có phần mở rộng) vào tệp txt
with open(duong_dan_txt, 'w', encoding='utf-8') as tep_txt:
tep_txt.write(ten_co_so)
print("Đã tạo xong các tệp txt tương ứng với hình ảnh.")
def chinh_sua_noi_dung_txt(self):
"""Chỉnh sửa nội dung các tệp txt, loại bỏ dấu ngoặc và số, chuyển dấu gạch dưới thành dấu phẩy."""
for duong_dan_txt in self.tep_txt_da_tao:
with open(duong_dan_txt, 'r', encoding='utf-8') as tep:
noi_dung = tep.read()
# Xóa dấu ngoặc và số bên trong
noi_dung = self.dau ngoac_pattern.sub('', noi_dung)
# Thay thế dấu gạch dưới bằng dấu phẩy
noi_dung = noi_dung.replace(self.dau_gach_duong, ",")
with open(duong_dan_txt, 'w', encoding='utf-8') as tep:
tep.write(noi_dung)
print("Đã xóa dấu ngoặc và số trong nội dung tệp txt, và chuyển đổi dấu gạch dưới thành dấu phẩy.")
def main():
# Yêu cầu người dùng nhập đường dẫn thư mục hình ảnh
thu_muc_goc = input("Vui lòng nhập đường dẫn đầy đủ của thư mục chứa hình ảnh: ")
tao_tep = TaoTepVanBan(thu_muc_goc)
tao_tep.tao_tep_tu_hinh_anh()
tao_tep.chinh_sua_noi_dung_txt()
# Chạy hàm
main()