數據處理 · Python · 跨平台
影片批次重新命名 — 數據處理實戰
65 首吉他 cover 影片從混亂檔名到統一格式的完整實戰記錄。 過程中遭遇隱形字元、編碼衝突、metadata 檔案干擾等各種坑, 逐一排查解決,最終提煉出可泛化的工作流程。
📊
數據處理的典型場景
這個任務的本質是數據清洗與標準化——面對非結構化、不一致的原始數據(檔名),透過多輪交叉驗證(Wikipedia API)補全缺失資訊,建立對照表人工審核後批次執行。這套流程可以直接應用到任何需要整理非結構化數據的場景,例如:清理 CSV 中的髒數據、統一客戶資料格式、標準化日誌檔案等。
涉及的技術與知識
PythonWikipedia APIos.listdir字元編碼處理跨平台檔案系統批次處理
策略思考
🎯 核心目標
- • 整理「時間性文件」或「影片」,最終目標是生成封面或標準化
- • 策略:用 LLM 規範化文件處理
💥 遇到的問題
- • 命名混亂、擺放位置混亂
- • 拼法不統一(大小寫問題)
- • 命名次序不一致
🤖 LLM 的挑戰與優勢
⚠️ 挑戰
個人化問題 — 每個人的命名習慣太雜亂,沒有規律性,LLM 難以套用單一規則統一處理
✅ 優勢
模糊關聯能力 — 雖然命名規則不統一,但 LLM 擅長理解字詞之間的關係(例如「藝人」↔「歌名」的關聯),能精確檢索和匹配
解決思路
面對上述問題,設計了一個人機協作的四步流程——讓 AI 負責模糊匹配和建議,人負責最終確認:
1
📋先列出表建立完整的檔案清單或表格,掌握全貌
2
🔍搞清命名規則釐清原本的命名邏輯與規律
3
🤖讓 AI 建議改名AI 根據關聯性建議新名字,列在表格中對比
4
✅確認再改真實檔案人工確認無誤後,才修改實際檔案
任務背景
3 個資料夾共 65 首吉他 cover 影片(含封面圖),原始檔名混亂不一致—— 有些只有英文歌名(如 salamander.mov)、 有些缺歌手資訊、有些有拼寫錯誤,還有 macOS 跨平台傳輸帶來的隱形字元。 目標是統一重新命名為「演唱人-歌名 guitar cover (動漫 OP/ED)」格式。
最終成果
✅
63 首影片 + 封面全部成功重新命名
2 首缺少封面圖
踩過的坑與解決方案
🔍
檔名不一致、缺少歌手資訊
檔名如 salamander.mov、ecosystem.mov 無法判斷演唱者
解決:透過 Wikipedia API(日文版)搜尋歌曲名 + 動漫名稱,反覆交叉比對確認歌手身份
✏️
歌手名稱拼寫錯誤
原始檔名中 Nothing's Craved In Stone(Craved 拼錯)及所有格位置錯誤
解決:統一修正為正確拼寫 Nothing's Carved In Stone
👻
macOS 隱形字元(Apple PUA)
檔名中間有 \uf00a(Apple 私有用域字元),肉眼看不見但導致比對失敗
解決:用 Python repr() 印出實際內容發現隱形字元,改用 os.listdir() 列舉 + 字串比對
🌐
Windows CMD 編碼問題(cp950 vs UTF-8)
Python print() 輸出日文/特殊字元時 UnicodeEncodeError
解決:腳本開頭加入 sys.stdout 重設為 UTF-8 編碼
🍎
macOS metadata 檔案干擾
大量 ._ 開頭的檔案被誤改名,導致正式檔案無法覆蓋同名目標
解決:重新命名邏輯加入 not f.startswith('._') 過濾條件
🔎
Wikipedia API 搜尋不精確
單一搜尋詞無法精確定位歌手
解決:多輪搜尋策略:歌名 → 歌名+動漫 → 歌名+歌手確認
提煉出的工作流程
從這次經驗中整理出適用於任何批次檔案重新命名的 7 步工作流程:
1
盤點
列出所有檔案,建立原始檔案清單(os.listdir)
2
分析
識別檔名中的規律與缺失資訊
3
建立對照表
製作「原檔名 → 新檔名」對照表,Markdown 表格方便審核
4
外部驗證
對缺乏資訊的項目進行搜尋確認(Wikipedia API 多輪搜尋)
5
審核計畫表
讓使用者確認所有項目,標記不確定的項目
6
撰寫腳本
記錄 log、檢查檔案存在、過濾 metadata、處理編碼
7
執行與驗證
執行後檢查 SKIP/ERR 項目,處理殘留問題
關鍵程式碼片段
# 偵測隱形字元
for f in os.listdir(directory):
print(repr(f)) # 會顯示 \uf00a 等隱形字元
# Wikipedia API 搜尋(多輪策略)
def search_wiki(query, lang="ja"):
url = f"https://{lang}.wikipedia.org/w/api.php"
params = (f"?action=query&list=search"
f"&srsearch={urllib.parse.quote(query)}"
f"&format=json&srlimit=3")
resp = urllib.request.urlopen(url + params, timeout=15)
return json.loads(resp.read())['query']['search']
# 過濾 macOS metadata 檔案
files = [f for f in os.listdir(directory)
if not f.startswith('._') and f != '.DS_Store']
# Windows UTF-8 編碼修正
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,
encoding='utf-8', errors='replace')學到的經驗
🌐
編碼先行
涉及日文/中文的 Python 腳本,務必先處理 stdout 編碼 — Windows 終端機 cp950 無法處理 UTF-8 字元
🍎
跨平台必定有副作用
macOS → Windows 檔案傳輸會帶來 ._ 檔案、.DS_Store、隱形字元(\uf00a~\uf0ff)
🔎
多輪交叉搜尋
單一搜尋詞不夠精確時,用歌名 → 歌名+動漫 → 歌名+歌手 多輪確認
👻
肉眼看不到不代表不存在
repr() 是偵錯隱形字元的好幫手,字串比對失敗時先懷疑隱形字元
📋
先審核再執行
建立完整對照表讓使用者確認後再批次執行,比邊做邊改安全得多