如何用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)

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


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


後續問題

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


參考博文

Python正則表達式指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章