题
我有一堆文件(电视剧集,尽管这是相当任意的),我想检查它们是否匹配特定的命名/组织方案。
现在:我有三个正则表达式数组,一个用于有效文件名,一个用于缺少剧集名称的文件,一个用于有效路径。
然后,我循环遍历每个有效文件名正则表达式,如果匹配,则将其附加到“有效”字典,如果不匹配,则对丢失的 ep-name 正则表达式执行相同操作,如果匹配,我将其附加到“无效”字典" 带有错误代码的字典(2:'缺少剧集名称'),如果两者都不匹配,则它会被添加为无效,并带有'格式错误的名称'错误代码。
可以找到当前的代码 这里
我想添加一条规则来检查每个目录中是否存在folder.jpg 文件,但添加此规则会使代码在当前状态下变得更加混乱。
我怎样才能以更具可扩展性的方式编写这个系统?
它需要检查的规则是..
- 文件格式为
Show Name - [01x23] - Episode Name.avi
或者Show Name - [01xSpecial02] - Special Name.avi
或者Show Name - [01xExtra01] - Extra Name.avi
- 如果文件名的格式为
Show Name - [01x23].avi
显示输出的“缺少剧集名称”部分 - 路径的格式应为
Show Name/season 2/the_file.avi
(其中第 2 季应该是文件名中正确的季节编号) - 每个
Show Name/season 1/
文件夹应包含“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
}
解决方案
我想添加一个规则,该规则可以检查每个目录中是否存在文件夹。
这看起来不错。事实上,你当前的代码做得很好,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
具有 1 比 1 的比例。使用两个数组而不是字典来强制执行顺序。
可以列出忽略的和必需的文件。这 .
和 ..
文件可能应该被自动忽略。应该允许用户输入可以 shell 扩展的“glob”。我在想这里 svn:ignore
属性,但通配对于列出文件来说是很自然的。
这里 start_dir
默认为当前目录,但如果您想要一个文件来运行一堆目录的自动测试,这将很有用。
这里真正的松散的结局是路径模板以及“有效文件”所需的路径。如果不编写一个大型正则表达式并从中进行分组,我真的无法想出一个可靠的想法......构建一个模板。这感觉很像编写 TextMate 语言语法。但这开始偏离易用性。真正的问题是路径模板不是由 parts
, ,这是有道理的,但增加了复杂性。
这个策略符合你的想法吗?
其他提示
也许你应该采取默认的方法:“文件名是正确的”并从那里开始反驳该声明:
事实上,您只允许使用以下内容的文件名:“节目名称”、“季号 x 集数”和“集名称”,您确定这些项目应该用“-”(破折号)分隔,因此您必须有其中 2 个项目才能保证文件名正确。
如果检查通过,您可以使用代码来检查节目名称是否与父级文件夹中看到的节目名称匹配(我假设不区分大小写),季节编号是否与父级文件夹数值匹配(带或不带额外的 0)前置)。
但是,如果您没有看到正确数量的破折号,您会立即知道出现问题并在其余测试等之前停止。
并单独检查文件是否 folder.jpg
存在并采取必要的行动。 或者 首先执行此操作,然后从该文件夹中的其余文件中过滤该文件。