增量保存

时间:2015-01-26 08:50:13

标签: python save maya

我正在尝试编写增量保存的脚本,但是我遇到了一些小问题。

如果文件名是“aaa.ma”,我将收到以下错误 - ValueError: invalid literal for int() with base 10: 'aaa' #如果我的文件名为“aaa_0001”,则不会发生错误

如果我以这种格式编写代码,就会发生这种情况:Link

因此,为了纠正上述问题,我输入if..else..声明 - Link,似乎已经解决了手头的问题,但我想知道是否有更好的方法此?

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

使用正则表达式可以获得更好的灵活性,尤其是对于像这样的文件重命名脚本。

在您的情况下,由于您知道预期的文件名格式为"some_file_name_<increment_number>",因此您可以使用正则表达式为您进行搜索和匹配。我们应该这样做的原因是因为人/用户可能不是机器,并且可能不遵守我们的脚本所期望的确切命名约定。例如,用户可以将文件命名为aaa_01.ma,甚至是aaa001.ma,而不是脚本当前所需的aaa_0001。要在脚本中构建这种灵活性,可以使用正则表达式。对于您的用例,您可以这样做:

# name = lastIncFile.partition(".")[0] # Use os.path.split instead
name, ext = os.path.splitext(lastIncFile)

import re

match_object = re.search("([a-zA-Z]*)_*([0-9]*)$", name)
# Here ([a-zA-Z]*) would be group(1) and would have "aaa" for ex.
# and ([0-9]*) would be group(2) and would have "0001" for ex.
# _* indicates that there may be an _, or not.
# The $ indicates that ([0-9]*) would be the LAST part of the name.

padding = 4  # Try and parameterize as many components as possible for easy maintenance 
default_starting = 1
verName = str(default_starting).zfill(padding)  # Default verName
if match_object: # True if the version string was found
    name = match_object.group(1)
    version_component = match_object.group(2)
    if version_component:
        verName = str(int(version_component) + 1).zfill(padding)

newFileName = "%s_%s.%s" % (name, verName, ext)
incSaveFilePath = os.path.join(curFileDir, newFileName)

在Python正则表达式上查看这个不错的tutorial,以了解上述块中发生了什么。您可以根据您的使用案例,测试和需求随意调整,发展和构建正则表达式。

额外提示:

在脚本开头调用cmds.file(renameToSave=True)。这将确保文件不会意外地保存在自身上,并强制脚本/用户重命名当前文件。只是一个安全措施。

如果你想对你的正则表达式稍微有点想法并使它们更具可读性,你可以尝试这样做:

match_object = re.search("(?P<name>[a-zA-Z]*)_*(?P<version>[0-9]*)$", name)
name = match_object.group('name')
version_component = match_object('version')

这里我们使用?P<var_name>...语法为匹配组分配一个dict密钥名称。在您访问它时可以提高可读性 - mo.group('version')mo.group(2)更清晰。 请务必完成official docs

使用Maya的命令保存。这将确保Maya在保存期间和之前完成所有检查:

cmds.file(rename=incSaveFilePath)
cmds.file(save=True)

更新-2:

如果你想在这里检查空间,那么这是一个更新的正则表达式:

match_object = re.search("(?P<name>[a-zA-Z]*)[_ ]*(?P<version>[0-9]*)$", name)

此处[_ ]*将检查0 - 多次出现_(空格)。对于更多正则表达式的东西,尝试和自学是最好的方法。看看这篇文章的链接。

希望这有帮助。