如何检查文件集是否符合命名方案

时间:2020-03-05 18:41:20  来源:igfitidea点击:

我有一堆文件(尽管很随意,但电视剧集很丰富),我想检查它们是否符合特定的命名/组织方案。

当前:我有三个正则表达式数组,一个用于有效文件名,一个用于缺少情节名称的文件,一个用于有效路径。

然后,我循环遍历每个有效文件名正则表达式(如果匹配),将其添加到"有效"字典中;如果不匹配,则对缺少的ep名称正则表达式执行相同的操作;如果匹配,则将其添加到"无效"带有错误代码(2:"缺少短名称"的字典),如果二者均不匹配,则会使用"格式错误的名称"错误代码将其添加到无效内容中。

当前代码可以在这里找到

我想添加一个规则来检查每个目录中是否存在folder.jpg文件,但是添加此规则会使代码在当前状态下更加混乱。

我该如何以更扩展的方式编写此系统?

它需要检查的规则是..

  • 文件格式为"显示名称-[01x23]-情节Name.avi"或者"显示名称-[01xSpecial02]-特殊名称.avi"或者"显示名称-[01xExtra01]-额外名称.avi"
  • 如果文件名的格式为"显示名称-[01x23] .avi",则将其显示在输出的"缺少情节名称"部分
  • 路径的格式应为"显示名称/季节2 / the_file.avi"(其中季节2应该是文件名中正确的季节编号)
  • 每个"显示名称/季节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
}

解决方案

回答

也许我们应该采用默认的方法:"文件名正确",然后从那里开始反驳该声明:

事实是,我们只允许使用"显示名称","季节编号x节目编号"和"剧集名称"作为文件名,因此,我们一定知道这些项目应以"-"(破折号)分隔,因此我们必须有2个文件名是正确的。
如果检查出结果,则可以使用代码检查显示名称是否与在父级的父文件夹中看到的显示名称相匹配(我假设是不区分大小写的),季节编号与父文件夹的数值匹配(带或者不带额外的0)前置)。

但是,如果我们没有看到正确的破折号,我们会立即知道有问题,并在其余测试之前停止。

并且我们可以分别检查文件" folder.jpg"是否存在并采取必要的措施。或者先执行该操作,然后从该文件夹中的其余文件中过滤该文件。

回答

I want to add a rule that checks for
  the presence of a folder.jpg file in
  each directory, but to add this would
  make the code substantially more messy
  in it's current state..

这看起来还不错。实际上,我们当前的代码做得很好,Sven提到了一种很好的实现方法:

  • 获取所有文件的列表
  • 检查"必需"文件

我们只需要在字典中添加所需文件的列表即可:

checker = {
  ...
  'required': ['file', 'list', 'for_required']
}

至于有更好/可扩展的方法可以做到这一点?我不确定。我只能真正想出一种方法来删除"多个"正则表达式,并以Sven使用定界符的想法为基础。因此,我的策略是按如下方式定义字典(很抱歉,我不了解Python语法,我有点懒惰地查找它,但应该有意义。 ):

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/'
}
  • 根据定界符分割文件名。
  • 检查每个零件。

因为它是一个有序列表,所以我们可以确定缺少哪些部分,如果某个节与任何模式都不匹配,则该节的格式错误。在这里,"部分"和"样式"的比例为1:1. 使用两个数组而不是字典来强制执行该顺序。

可以列出忽略的文件和必需的文件。 ...文件可能应该被自动忽略。应该允许用户输入可以通过外壳扩展的" glob"。我在这里考虑svn:ignore属性,但是列出文件很自然。

这里的" start_dir"将默认为当前目录,但是如果我们希望单个文件对一堆目录运行自动测试,这将很有用。

真正的松散端是路径模板,同样,"有效文件"所需的路径也一样。如果不编写一个大的正则表达式并从中选取组来构建模板,我真的想不出一个可靠的主意。感觉很像编写TextMate语言语法。但这开始迷失了易用性。真正的问题是路径模板不是由" parts"组成的,这很有意义,但却增加了复杂性。

此策略是否符合想法?