專案 將帶有美國風格日期的檔案改名為歐洲風格日期 地實施
阿新 • • 發佈:2020-12-14
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
完成。