嗨,我想将具有一个源模式(例如IMG_20190401_235959.jpg)的文件重命名为目标模式(例如2019-04-01_23_59_59.jpg)
我正在尝试在python中做到这一点,但我找不到如何使用正则表达式来构建新文件名的方法:
#!/usr/bin/python
import os, glob, sys, re
os.chdir(sys.argv[1])
for filename in glob.glob("IMG_*.jpg"):
newfilename = re.sub(?????
try:
os.rename(filename,newfilename)
except OSError,e:
print e
答案 0 :(得分:1)
您可以使用re.findall
从文件路径中获取必要的组,然后重新加入:
import re
def new_path(s):
_, a, b, f_type = re.findall('[a-zA-Z0-9]+', s)
new_b = '_'.join(b[i:i+2] for i in range(0, len(b), 2))
return f'{a[:4]}-{a[4:6]}-{a[6:]}_{new_b}.{f_type}'
print(new_path('IMG_20190401_235959.jpg'))
输出:
'2019-04-01_23_59_59.jpg'
然后:
import os, glob, sys, re
os.chdir(sys.argv[1])
for filename in glob.glob("IMG_*.jpg"):
try:
os.rename(filename, new_path(filename))
except OSError,e:
print(e)
答案 1 :(得分:1)
不确定正则表达式是否是此处的最佳选择。您可以将其拆分并轻松地使用基本的字符串操作:
original = 'IMG_20190401_235959.jpg'
ol = original.split('_')
date = f'{ol[1][:4]}-{ol[1][4:6]}-{ol[1][6:8]}'
time = f'{ol[2][:2]}_{ol[2][2:4]}_{ol[2][4:6]}'
new = f'{date}_{time}.jpg'
print(new)
答案 2 :(得分:0)
以下代码对我有用,但是它仅使用正则表达式删除文件名中的IMG_
,因此您也可以完全删除正则表达式。
newfilename = re.sub('IMG_', '', filename)
newfilename = newfilename[0:4] + '-' + newfilename[4:6] + '-' + newfilename[6:11] + '_' + newfilename[11:13] + '_' + newfilename[13:]
答案 3 :(得分:0)
如果您的输入是一致的,这应该起作用:
import re
pattern = r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})"
test_str = "IMG_20190401_235959.jpg"
subst = "\\1-\\2-\\3_\\4_\\5_\\6"
result = re.sub(pattern, subst, test_str, 0, re.MULTILINE)
if result:
print (result)
# 2019-04-01_23_59_59.jpg
答案 4 :(得分:0)
import re
regex = re.compile(r'^IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})\.jpeg$')
oldStr = 'IMG_20190401_235959.jpeg';
match = regex.match(oldStr)
newStr = '{}-{}-{}_{}_{}.jpg'.format(*match.groups())
print(newStr) # 2019-04-01_23_59.jpg
答案 5 :(得分:0)
您可以做的是在使用RegEx之前对其进行预编译。您可以按照以下方式进行操作:
import re
sub_name = re.compile(r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})", flags=re.I).sub
在这里, sub_name 是一个函数,您可以稍后在for
循环中使用它来替换每个图像的名称。
注意:在Windows中,忽略大小写(大写/小写)可能很有用,但是您还需要将调用调整为glob.glob
。
以下是使用glob.glob
的解决方案,但您也可以使用os.walk
浏览目录,搜索所有图像…
# coding: utf-8
import glob
import os
import re
import sys
sub_name = re.compile(r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})", flags=re.I).sub
work_dir = sys.argv[1]
for old_path in glob.glob(os.path.join(work_dir, "IMG_*.jpg")):
dirname, old_name = os.path.split(old_path)
new_name = sub_name("\\1-\\2-\\3_\\4_\\5_\\6", old_name)
new_path = os.path.join(dirname, new_name)
try:
os.rename(old_path, new_path)
except OSError as exc:
print(exc)
我注意到您使用了print
语句和Python 2.6语法作为例外。最好使用新语法。
如果使用Python 2.7,则可以添加指令:
from __future__ import print_function
将其放在您的进口商品的顶部...