繁体   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