如何检查文件集是否符合命名规则
我有一堆文件(是电视节目集,虽然这个选择其实没什么特别的)想要检查一下它们是否符合特定的命名和组织规则。
目前:我有三个正则表达式数组,一个是用来匹配有效文件名的,一个是用来找缺少剧集名称的文件的,还有一个是用来匹配有效路径的。
接着,我会遍历每个有效文件名的正则表达式,如果匹配上了,就把它加到一个“有效”的字典里;如果没有匹配上,就用缺少剧集名称的正则表达式再试一次,如果匹配上了,我就把它加到一个“无效”的字典里,并标记错误代码(2:‘缺少剧集名称’);如果两个都不匹配,就把它加到无效字典里,并标记为‘名称格式错误’。
当前的代码可以在这里找到。
我想添加一个规则,检查每个目录里是否有一个folder.jpg文件,但这样一来,现有的代码会变得相当复杂。
我该如何以更易扩展的方式来编写这个系统呢?
需要检查的规则包括:
- 文件格式应为
节目名称 - [01x23] - 剧集名称.avi
或节目名称 - [01xSpecial02] - 特别节目名称.avi
或节目名称 - [01xExtra01] - 额外节目名称.avi
- 如果文件名格式为
节目名称 - [01x23].avi
,则在输出中显示为‘缺少剧集名称’部分 - 路径格式应为
节目名称/第二季/文件名.avi
(其中第二季应为文件名中正确的季号) - 每个
节目名称/第一季/
文件夹应该包含“folder.jpg”文件
有什么想法吗?虽然我在检查电视节目,但这个概念/代码应该能应用到很多其他事情上。
我唯一想到的就是用字典列表的格式:
checker = [
{
'name':'valid files',
'type':'file',
'function':check_valid(), # runs check_valid() on all files
'status':0 # if it returns True, this is the status the file gets
}
2 个回答
也许你可以先假设“文件名是正确的”,然后再从这个假设出发去找出问题。
因为你只允许文件名包含:‘节目名称’,‘季号 x 集号’和‘集名称’,所以你可以确定这些部分之间应该用“-”来分隔。因此,一个正确的文件名应该有两个“-”。
如果这个条件满足,你可以用你的代码检查节目名称是否和上一级文件夹中的节目名称一致(我想是不区分大小写的),季号是否和上一级文件夹中的数字匹配(可以有或没有前面的0)。
但是,如果你发现“-”的数量不对,你就可以立刻知道有问题了,这样就可以在进行其他检查之前停止。
另外,你还可以检查文件 folder.jpg
是否存在,并采取相应的措施。或者先做这个检查,然后把这个文件从该文件夹中的其他文件中筛选出来。
我想加一个规则,检查每个文件夹里是否有一个folder.jpg文件,但这样做会让代码变得很乱。
其实这看起来并不糟糕。你现在的代码做得很好,Sven也提到了一种不错的方法:
- 获取所有文件的列表
- 检查是否有“必需”的文件
你只需要在你的字典里添加一个必需文件的列表:
checker = {
...
'required': ['file', 'list', 'for_required']
}
至于有没有更好的或更灵活的方法来实现这一点,我不太确定。我只想到一种可能的方法,就是放弃“多个”正则表达式,基于Sven的想法使用分隔符。所以我的策略是定义一个字典,虽然我不太懂Python的语法,也懒得查,但应该能理解。这里的/regex/是正则表达式的简写:
check_dict = {
'delim' : /\-/,
'parts' : [ 'Show Name', 'Episode Name', 'Episode Number' ],
'patterns' : [/valid name/, /valid episode name/, /valid number/ ],
'required' : ['list', 'of', 'files'],
'ignored' : ['.*', 'hidden.txt'],
'start_dir': '/path/to/dir/to/test/'
}
- 根据分隔符拆分文件名。
- 检查每个部分。
因为这是一个有序列表,你可以确定哪些部分缺失,如果某个部分不符合任何模式,那就是格式不正确。在这里,parts
和patterns
是一一对应的。用两个数组代替字典可以保持顺序。
可以列出被忽略和必需的文件。.
和..
文件应该自动被忽略。用户应该可以输入“通配符”,这些可以被shell扩展。我在这里想到的是svn:ignore
属性,但使用通配符列出文件是很自然的。
这里的start_dir
默认是当前目录,但如果你想对一堆目录进行自动测试,这会很有用。
真正的问题是路径模板,以及“有效文件”所需的路径。我实在想不出一个好的主意,除非写一个大的正则表达式并从中提取组来构建模板。这让我感觉像是在写TextMate的语言语法。但这就开始影响易用性了。真正的问题是路径模板不是由parts
组成的,这虽然合理,但增加了复杂性。
这个策略和你想的方向一致吗?