2014-05-19 146 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或多个先前表达的(在这种情况下,数位)