我正在尝试重命名文件,以便它们包含一个ID后跟一个 - (int)。这些文件通常以这种方式出现在我身上,但有时它们会以1234567-1(作物到底部).jpg的形式出现。
我一直在尝试使用以下代码,但我的正则表达式似乎没有任何效果。散步的原因是因为我们必须处理包含许多图像的大型目录树。
def fix_length():
for root, dirs, files in os.walk(path):
for fn in files:
path2 = os.path.join(root, fn)
filename_zero, extension = os.path.splitext(fn)
re.sub("[^0-9][-]", "", filename_zero)
os.rename(path2, filename_zero + extension)
fix_length()
我在re.sub行之前和之后插入了filename_zero的print语句,我得到了相同的结果(即1234567-1(crop to bottom)不是我想要的)
这会引发异常,因为重命名正在尝试创建已存在的文件。
我想也许在正则表达式中添加[ - ]是问题,但删除它并再次运行我会期望12345671.jpg但这也不起作用。我的正则表达式失败了,或者我的正则表达式失败了。
作为后续行动,我已经获得了所有精彩的帮助,并找到了解决我具体问题的方法。
path = 'C:\Archive'
errors = 'C:\Test\errors'
num_files = []
def best_sol():
num_files = []
for root, dirs, files in os.walk(path):
for fn in files:
filename_zero, extension = os.path.splitext(fn)
path2 = os.path.join(root, fn)
ID = re.match('^\d{1,10}', fn).group()
if len(ID) <= 7:
if ID not in num_files:
num_files = []
num_files.append(ID)
suffix = str(len(num_files))
os.rename(path2, os.path.join(root, ID + '-' + suffix + extension))
else:
num_files.append(ID)
suffix = str(len(num_files))
os.rename(path2, os.path.join( root, ID + '-' + suffix +extension))
else:
shutil.copy(path2, errors)
os.remove(path2)
此代码根据(最多)文件名中的前10个数字字符创建ID。然后我使用存储此ID实例的列表并使用列表的长度附加后缀。第一个文件将为-1,第二个为-2等......
我只对长度为7的ID感兴趣(或者他们应该只是),但允许读取最多10个以便在标签中出现人为错误。 ID超过7的所有文件都会移动到我们可以调查的文件夹中。
感谢您指出我正确的方向。
答案 0 :(得分:2)
re.sub()
返回更改的字符串,但忽略返回值。
您想要将结果重新分配到filename_zero
:
filename_zero = re.sub("[^\d-]", "", filename_zero)
我也纠正了你的正则表达;这将从基本文件名中删除任何不是数字或短划线的内容:
>>> re.sub(r'[^\d-]', '', '1234567-1(crop to bottom)')
'1234567-1'
请记住,字符串是不可变的,你不能就地改变它们。
如果您想要的只是前导数字加上可选的破折号后缀,请选择要保留的字符,而不是删除您不想要的内容:
filename_zero = re.match(r'^\d+(?:-\d)?', filename_zero).group()
答案 1 :(得分:0)
new_filename = re.sub(r'^([0-9]+)-([0-9]+)', r'\g1-\g2', filename_zero)
尝试使用这个正则表达式,我希望这是正则表达式在Python中的工作方式,我不经常使用它。您似乎也忘记将re.sub调用返回的值赋给filename_zero变量。