4

我有一堆文件(电视剧集,虽然这是相当随意的),我想检查它们是否匹配特定的命名/组织方案..

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

然后,我遍历每个有效文件名正则表达式,如果匹配,则将其附加到“有效”字典,如果不匹配,则对缺少的 ep-name 正则表达式执行相同操作,如果匹配,我将其附加到“无效” " 带有错误代码 (2:'missing epsiode name') 的 dict,如果两者都不匹配,则使用 'malformed name' 错误代码将其添加为无效。

当前代码可以在这里找到

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

我怎样才能以更可扩展的方式编写这个系统?

它需要检查的规则是..

  • 文件格式为Show Name - [01x23] - Episode Name.aviShow Name - [01xSpecial02] - Special Name.aviShow 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
}
4

2 回答 2

2

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

这看起来还不错。事实上,你当前的代码做得很好,Sven 也提到了一个很好的方法:

  1. 获取所有文件的列表
  2. 检查“必需”文件

您只需将所需文件的列表添加到您的字典中:

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/'
}
  1. 根据分隔符拆分文件名。
  2. 检查每个部件。

因为它是一个有序列表,您可以确定缺少哪些部分,如果某个部分与任何模式都不匹配,则它是格式错误的。这里partspatterns具有 1 比 1 的比例。两个数组而不是字典强制执行顺序。

可以列出忽略的和需要的文件。和文件可能应该被自动忽略...应该允许用户输入可以扩展外壳的“globs”。我在这里考虑svn:ignore属性,但是对于列出文件来说,通配是很自然的。

这里start_dir将默认为当前目录,但如果您想要一个文件来运行一堆目录的自动测试,这将很有用。

这里真正的松散端是路径模板,并且沿着相同的路线,“有效文件”需要什么路径。如果不编写一个大型正则表达式并从中获取组...构建模板,我真的无法想出一个可靠的想法。感觉很像编写 TextMate 语言语法。但这开始偏离易用性。真正的问题是路径模板不是由 组成的parts,这是有道理的,但会增加复杂性。

这个策略与你的想法一致吗?

于 2008-08-21T22:02:01.853 回答
0

也许你应该采取默认的方法:“文件名是正确的”并从那里开始反驳该陈述:

事实上,您只允许使用以下文件名:“节目名称”、“季号 x 剧集号”和“剧集名称”,您肯定知道这些项目应该用“-”(破折号)分隔,因此您必须有两个文件名是正确的。
如果检查成功,您可以使用您的代码检查节目名称是否与父文件夹中看到的节目名称匹配(我假设不区分大小写),季节编号是否与父文件夹数值匹配(有或没有额外的 0前置)。

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

并且您可以单独检查文件是否folder.jpg存在并采取必要的措施。先执行此操作,然后从该文件夹中的其余文件中过滤该文件。

于 2008-08-21T05:59:00.797 回答