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