我正在尝试编写增量保存的脚本,但是我遇到了一些小问题。
如果文件名是“aaa.ma”,我将收到以下错误 - ValueError: invalid literal for int() with base 10: 'aaa' #
如果我的文件名为“aaa_0001”,则不会发生错误
如果我以这种格式编写代码,就会发生这种情况:Link
因此,为了纠正上述问题,我输入if..else..
声明 - Link,似乎已经解决了手头的问题,但我想知道是否有更好的方法此?
任何建议都将不胜感激!
答案 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)
如果你想在这里检查空间,那么这是一个更新的正则表达式:
match_object = re.search("(?P<name>[a-zA-Z]*)[_ ]*(?P<version>[0-9]*)$", name)
此处[_ ]*
将检查0 - 多次出现_
或(空格)。对于更多正则表达式的东西,尝试和自学是最好的方法。看看这篇文章的链接。
希望这有帮助。