[英]Rename a group of files in 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,但無法正常工作。
我也考慮過使用字符串操作,但也沒有成功。
任何幫助將不勝感激。 謝謝。
os.path.split
將路徑( /home/mattdmo/work/projects/python/2014/website/index.html
)拆分為其組件目錄和文件名。
如@wim所建議的 ,如果文件名的長度完全相同,則可以使用字符串切片將兩個索引之間發生的任何內容分開,然后將它們重新連接在一起。 因此,在您的示例中,
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)
我們是否可以假設文件的名稱在_20110602之前都是相同的?
如果真是這樣,那么實際上很容易做到。
首先,您需要該差異的索引 。 從字符0(在這種情況下為“ 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.
唯一需要注意的是,到目前為止,它們必須具有相同的名稱才能起作用。 如果它們的長度相同,那么這仍然很容易,但是您必須自己弄清楚索引是什么,而不是使用字符串差異方法。
如果在“ 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),它引用第三組括號
\\d or [0-9]
相同。 他們匹配任何數字
{number}
:重復上一個令牌(在這種情況下為數字)的次數
+
:前一個表達式中的1個或多個(在這種情況下為數字)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.