我尝试使用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 :(得分: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}
:重复前一个标记(在本例中是一个数字)的次数
+
:前一个表达式中的一个或多个(在本例中为数字)