2014-05-19 145 views
0

我想用Python重命名一個目錄中的某些文件。我在這裏環顧了論壇,因爲我是一個新手,所以我無法調整我需要的東西。在python中重命名一組文件

說,在目錄中我有一組文件名爲

FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602125225754_7_S110472_I238620.jpg FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602125236347_8_S110472_I238620.jpg FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602125236894_5_S110472_I238621.jpg FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602125248691_6_S110472_I238621.jpg

,我想刪除 「125225754」, 「125236347」 ,「125236894」和「125248691」,這樣我的結果文件名就是 FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602_7_S110472_I238620.jpg FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602_8_S110472_I238620.jpg FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602_5_S110472_I238621.jpg FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602_6_S110472_I238621.jpg

我試圖使用os.path.split這樣的,但它不能正常工作。

我也考慮過使用字符串操作,但還沒有成功。

任何幫助將不勝感激。謝謝。

+0

如果它們:次以前的令牌(在這種情況下爲數字)被重複

+數總是在相同的指標只是切片出 – wim

+0

@wim謝謝指數都一樣 – user3654307

回答

1

我們可以假設文件都是相同的名稱,最多的日期_20110602 [區別]?

如果是這樣的話,那實際上很容易。

首先你需要索引那個區別。從這個例子中的'F'開始,直到你遇到第一個差異爲止。您可以通過此編程方式做到這一點:

s1 = 'String1' 
s2 = 'String2' 
i = 0 
while(i < len(s1) && i < len(s2)): 
    if(s1[i] == s2[i]) i++ 
    else break 

而且我現在設定爲一階差分S1和S2(或者,如果沒有,它們的長度)。

從這裏你知道你想剝離從該索引到以下的所有內容_

j = i 
while(j < len(s1)): 
    if(s1[j] != '_') j++ 
    else break 
# j is the index of the _ character after i 
p1 = s1[:i] # Everything up to i 
p2 = s1[j:] # Everything after j 
s1 = p1.concat(p2) 
# Do the same for s2, or even better, do this in a loop. 

這裏唯一需要注意的是,它們必須是同一個名字到這點,這個工作。如果他們是相同的長度那麼這仍然是相當容易的,但你必須弄清楚自己的索引是什麼,而不是使用字符串差異方法。

+0

謝謝你給我帶來的想法 – user3654307

2

os.path.split將路徑(/home/mattdmo/work/projects/python/2014/website/index.html)拆分爲其組件目錄和文件名。

作爲@wim suggested,如果文件名的長度完全相同,則可以使用字符串分片來分隔兩個索引之間發生的任何事情,然後將它們重新組合在一起。所以,在你的榜樣,

filename = "FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602125248691_6_S110472_I238621.jpg" 
newname = filename[:57] + filename[66:] 
print(newname) 
# FILENAME_002_S_0295_MR_3_Plane_Localizer__br_raw_20110602_6_S110472_I238621.jpg 

這需要字符串的第58個字符(記得在Python字符串索引是從0開始)和67一個接其加入到所有字符。

現在你可以做到這一點,只是把所有的文件名到一個列表,並遍歷它讓您的新文件名:

import os 

filelist = os.listdir('.') # get files in current directory 
for filename in filelist: 
    if ".jpg" in filename: # only process pictures 
     newname = filename[:57] + filename[66:] 
     print(filename + " will be renamed as " + newname) 
     os.rename(filename, newname) 
+0

我想自動做到這一點。我不想從哪個數字的字符到哪個數字的字符數。 – user3654307

1

如果你總是有精確的字符串:存儲在 'my_directory' 文件夾中的文件名 '20110602':

import re #for regular expression 
from os import rename 
from glob import glob 

for filename in glob('my_directory/*.jpg'): 
    match = re.search('20110602', filename) 
    if match: 
    newname = re.sub(r'20110602[0-9]+_','20110602_', filename) 
    rename(filename, newname) 

一個更普遍的代碼以匹配任何YYYYMMDD(或YYYYDDMM):

import re #for regular expression 
from os import rename 
from glob import glob 

for filename in glob('my_directory/*.jpg'): 
    match = re.search(r'\d{4}\d{2}\d{2}\d+_', filename) 
    if match: 
    newname = re.sub(r'(\d{4}\d{2}\d{2})(\d+)(_)', '\\1'+'\\3', filename) 
    rename(filename, newname) 

'\\1':這是match.group(1),其指的是第一組括號

'\\3':這是match.group(3),其是指噸o第三組圓括號

\d or [0-9]:是一樣的。它們匹配任何數字

{number}:1或多個先前表達的(在這種情況下,數位)