在python中重命名一组文件

时间:2014-05-19 21:32:04

标签: python file-rename

我尝试使用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,但它无法正常工作。

我也考虑过使用字符串操作,但也没有成功。

非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我们可以假设这些文件的名称都是_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.

这里唯一需要注意的是,到目前为止,它们必须具有相同的名称才能发挥作用。如果它们是相同的长度那么这仍然相当容易,但你必须弄清楚索引是什么而不是使用字符串差异方法。

答案 2 :(得分: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)

\d or [0-9]:是一样的。它们匹配任何数字

{number}:重复前一个标记(在本例中是一个数字)的次数

+:前一个表达式中的一个或多个(在本例中为数字)