1. 程式人生 > >如何用python從文中獲取檔名再用正則表示式批量修改檔名

如何用python從文中獲取檔名再用正則表示式批量修改檔名

第零步:問題的提出

我在網上購買了星火英語的六級晨讀美文100篇(六級早已高分飄過,不過很喜歡這些文章,買來重新品味),但是發現其文章的命名都為01.txt或10.txt等。為了便於檢索需要修改檔名稱。

第一步:從檔案中取出檔名。

我發現txt檔案的第一行為檔名,格式為如:Passage 3. Three Passions I Have Lived for, 後面還有幾個換行符。寫下如下程式碼進行第一步修改:

import os
x = 1
while x < 101:
    if x < 10:
        file_name = "0"+str(x) + ".txt" #10一下則前面補零
        file = open(file_name)
    else:
        file_name = str(x) + ".txt"
        file = open(file_name)
    line = file.readline()
    file.close()
    os.rename(file_name,line) #重新命名
    x = x + 1
修改後檔名如下:

我發現這樣也不好,因為檔名太長,移到window系統下出現錯誤;而且在linux下無法讀取。所以我要把前面沒有用的東西去掉只留下文章的名字。

第二步,修改檔名

程式碼如下:

import re
import os
import shutil
import time

dir = "/home/leo/Documents/starfire100_2/" #檔案目錄

if os.path.isdir(dir): #檢驗目錄是否有誤
        print ("Directory exists!")
else:
        print ("Directory not exist.")
        time.sleep(5)
        exit()
filelist=[]

filelist=os.listdir(dir)
#print filelist

for i in filelist:
        tt_match = re.search(r'Passage\s{1,2}\d{1,3}\.?\s(.*)\n$',i) #匹配檔名,返回括號內的文章名
        if tt_match:
            NewFile = tt_match.group(1) #獲取匹配名存為newfile
            NewFile=i.replace(i,NewFile) # 修改
            shutil.move(dir+i,dir+NewFile) #執行修改
第三步:手工修改

修改後執行

ls | grep 'Passage'
還有如下條目:

去除最後一條屬於目錄所以還有三條未得到修改,不過數量不多,手動修改解決。

得到如下效果:


第四步:去除換行符replace空格

將上面的程式碼修改一下以後得到如下程式碼

import re
import os
import shutil
import time

#dir=raw_input("please input which Directory-Name to Rename:")

dir = "/home/leo/Documents/starfire100_2/"

if os.path.isdir(dir):
        print ("Directory exists!")
else:
        print ("Directory not exist.")
        time.sleep(5)
        exit()
filelist=[]

filelist=os.listdir(dir)
#print filelist

for i in filelist:
        NewFile = i.strip('\n') #去除掉最後那個回車符
        NewFile = re.sub(r'\s+','_',NewFile) #把所有的空格改為下劃線
        if NewFile[-1]=='_': #如果最後一個字元為下劃線則去除
            NewFile = NewFile[:-1] #去除最後一個下劃線
        shutil.move(dir+i,dir+NewFile)

得到如下效果,總算完成了


其實最後去除空格和回車符的程式碼可以加入修改檔名的程式碼之中,不過這個很容易就不修改了。

後續問題

我想我的解法一定不是最優的,因為只要找到第二個大寫字母就可以匹配出來。如果您能告訴我如何實現或者您有更好的方法請多指教,謝謝!

參考博文