1. 程式人生 > 其它 >專案 將帶有美國風格日期的檔案改名為歐洲風格日期 地實施

專案 將帶有美國風格日期的檔案改名為歐洲風格日期 地實施

技術標籤:python實踐python

1.作業系統:windows

2.實踐來源:《Python程式設計快速上手》這本書中,第165頁,有這樣一個專案:

假定你的老闆用電子郵件發給你上千個檔案,檔名包含美國風格的日期(MM-DD-YYYY),需要將它們改名為歐洲風格的日期(DD-MM-YYYY)。手工完成這個無聊的任務可能需要幾天時間!讓我們寫一個程式來完成它。
下面是程式要做的事:
• 檢查當前工作目錄的所有檔名,尋找美國風格的日期。
• 如果找到,將該檔案改名,交換月份和日期的位置,使之成為歐洲風格。
這意味著程式碼需要做下面的事情:
• 建立一個正則表示式,可以識別美國風格日期的文字模式。

• 呼叫 os.listdir(),找出工作目錄中的所有檔案。
• 迴圈遍歷每個檔名,利用該正則表示式檢查它是否包含日期。
• 如果它包含日期,用 shutil.move()對該檔案改名。
對於這個專案,開啟一個新的檔案編輯器視窗,將程式碼儲存為 renameDates.py。

3.遇到的問題:上哪裡找這麼些個美國格式的檔案呢?

4.解決方法:需要寫一段美國格式日期的生成器程式碼,研究半天(自己寫的程式碼有些冗長),後來發現已經有高人(感謝這位名叫烏冬味的作者,原文地址:https://www.cnblogs.com/wudongwei/p/9022097.html)幹過這事,而且程式碼簡潔,拿過來修改部分內容後,如下:

#! python
# 建立100個美國風格日期的檔案

import os
import random

# 將路徑指向需要的資料夾(下面這個5TTest是我的資料夾,用時,請替換為你自己的即可。)
os.chdir('D:\\5TTest')

# 先建立三個檔案看看,執行完沒錯的話,你可以將迴圈改為你想要的迴圈次數
for i in range(3):
    mm = random.randint(1, 12)
    dd = random.randint(1, 28) #這裡為了避免錯誤,就把日期範圍寫成了28天
    yy = random.randint(2000, 2020)
    date
= '{:0>2d}-{:0>2d}-{}'.format(mm, dd, yy) b = os.getcwd() + '\\USdate\\' if not os.path.exists(b): os.makedirs(b) creatname = b + date + '.txt' print(creatname) file = open(creatname, 'w') file.write('None') file.close() print('OK')

執行後,是這個樣子:
在這裡插入圖片描述
在這裡插入圖片描述

5.回到主題,本次實踐的專案——將帶有美國風格日期的檔案改名為歐洲風格日期,程式碼如下:

#! python3
# renameDates.py - Renames filenames with American MM - DD - YYYY date format
# to European DD - MM - YYYY.

import shutil, os, re

# 將路徑指向需要操作的資料夾(下面這個5TTest和USdate是我的資料夾,用時,請替換為你自己的即可。)。
os.chdir('D:\\5TTest\\USdate')

# 建立一個能識別美國日期格式的正則表示式。
datePattern = re.compile(r"""^(.*?) # 所有在日期之前的內容
    ((0|1)?\d)-                 # 表述月的一位或兩位數字
    ((0|1|2|3)?\d)-             # 表述日的一位或兩位數字
    ((19|20)\d\d)               # 表述年的四位數字
    (.*?)$                      # 所有日期之後的內容
    """, re.VERBOSE)

# 迴圈遍歷目標目錄下的檔案。
for amerFilename in os.listdir('.'):
    mo = datePattern.search(amerFilename)

    # 跳過沒有日期的檔案。
    if mo == None:
        continue

    # 新檔名的構成部分。
    beforePart = mo.group(1)
    monthPart  = mo.group(2)
    dayPart    = mo.group(4)
    yearPart   = mo.group(6)
    afterPart  = mo.group(8)

    # 組成歐洲格式的日期檔名。
    euroFilename = beforePart + dayPart + '-' + monthPart + '-' + yearPart + afterPart

    # 獲得檔案的完整絕對路徑。
    absWorkingDir = os.path.abspath('.')
    amerFilename = os.path.join(absWorkingDir, amerFilename)
    euroFilename = os.path.join(absWorkingDir, euroFilename)

    # 重新命名檔案。
    # print('Renameing "%s" to "%s" ...' % (amerFilename, euroFilename))
    shutil.move(amerFilename, euroFilename) # uncomment after testing

完成。