# 透過Python將CSV中的車牌放到最後一個欄位 ###### tags: `python` [GitHub](https://github.com/JingShun/PythonScript/blob/main/transLicensePlate.py) 2022/04/17 週五審計處的一位劉大哥透過別人轉介來找我, 問說怎麼透過Excel把車牌資訊撈出來放到最後一個欄位 怎麼從一大串文字中取出車牌? 當然是透過REGEX(正規表示式)呀 但印象中Excel不支援, 所以只能透過其他工具處理, 比如說匯出成CSV, 接著讓其他工具接手 那位劉大哥他聽過Python, 那就用Python處理吧 我對Python不熟, 正好來學習一下 ## 撈取車牌 汽機車可能格式 e.g. AAA-001, AA-0001, GA-A01, AAA-DZZ, KPA-0001, AA-A1 ..... 可以總結出符號`-`的前後各會有2~4個大寫英文或數字, 因此可以這樣設計 REGEX格式: `[\dA-Z]{2,4}-[\dA-Z]{2,4}` ## 程式 我的目錄結構如下: demo.csv是我的範例資料 transLicensePlate.py是程式主體 ![](https://i.imgur.com/f4C9fYh.png) 主程式`transLicensePlate.py`如下: ```python= import re # 處理正規表示式 import csv # 處理CSV import sys # 讀取命令參數 # 要分析的原始檔案(僅限csv) fileName = sys.argv[1] if len(sys.argv) > 1 else 'data.csv' # 處理後另存檔案 reportName = sys.argv[2] if len(sys.argv) > 2 else 'report.csv' # 解決大檔按導致的錯誤 maxInt = sys.maxsize try: csv.field_size_limit(maxInt) break except OverflowError: maxInt = int(maxInt/10) # 開啟原始 CSV 檔案 file = open(fileName, encoding='utf8') rows = csv.reader(file) # 另存 CSV 檔案 newFile = open(reportName, 'w', newline='', encoding='utf8') writer = csv.writer(newFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) # 處理每行資料 for row in rows: # 取出該筆資料中全部車牌 card = re.findall("[\dA-Z]{2,4}-[\dA-Z]{2,4}", ' '.join(row)) # 將取出的車牌附加到該筆資料的最後面 row.append(', '.join(card)) # 另存資料 writer.writerow(row) print(row) ``` ## 執行方法 執行有兩種方法 ``` # 使用方法一: # 假設原始檔名 data.csv,將會產出report.csv python3 transLicensePlate.py # 使用方法二: # 格式: transLicensePlate.py <來源> <輸出目標> python3 transLicensePlate.py data.csv report.csv ``` ![](https://i.imgur.com/fPBLZhM.png) ## 執行結果 執行後就會多一個結果檔案 ![](https://i.imgur.com/EMA19cF.png) 原始csv資料 有沒有雙引號包起來都ok ![](https://i.imgur.com/qsTxEKb.png) 處理後csv資料 ![](https://i.imgur.com/RyOwnXb.png) 用Excel打開ok ![](https://i.imgur.com/f2gfo0a.png)