簡體   English   中英

重命名python中的一組文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM