使用正则表达式排除文件重命名,Python中的字符?

时间:2014-05-13 17:05:41

标签: python regex python-2.7 batch-rename

我正在尝试重命名文件,以便它们包含一个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的所有文件都会移动到我们可以调查的文件夹中。

感谢您指出我正确的方向。

2 个答案:

答案 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变量。