增量保存
Incremental Saves
我正在尝试编写有关增量保存的脚本,但我 运行 遇到了一些小问题。
如果文件名为 "aaa.ma",我将收到以下错误 - ValueError: invalid literal for int() with base 10: 'aaa' #
如果我的文件名为 "aaa_0001"
,则不会发生这种情况
如果我以这种格式编写代码,就会发生这种情况:Link
所以为了解决上面的问题,我输入了一个if..else..
语句-Link,貌似解决了手头的问题,但我想知道有没有更好的对此的处理方法?
任何建议将不胜感激!
使用正则表达式以获得更好的灵活性,尤其是对于像这样的文件重命名脚本。
在你的情况下,因为你知道预期的文件名格式是 "some_file_name_<increment_number>"
,你可以使用正则表达式为你进行搜索和匹配。我们应该这样做的原因是因为 people/users 可能不是机器,并且可能不遵守我们的脚本期望的确切命名约定。例如,用户可以将文件命名为 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)
。这将确保文件不会被意外保存到自身,并强制 script/user 重命名当前文件。只是一个安全措施。
如果您想对正则表达式进行一些花哨的处理并使它们更具可读性,您可以尝试这样做:
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>...
语法为匹配组分配一个字典键名。在您访问它时提高可读性 - mo.group('version')
比 mo.group(2)
更清晰。
确保也通过 official docs。
使用 Maya 的命令保存。这将确保 Maya 在保存时和保存之前进行所有检查:
cmds.file(rename=incSaveFilePath)
cmds.file(save=True)
更新 2:
如果您想要检查 space,这里是一个更新的正则表达式:
match_object = re.search("(?P<name>[a-zA-Z]*)[_ ]*(?P<version>[0-9]*)$", name)
此处 [_ ]*
将检查 0 - _
或
(space) 的多次出现。对于更多正则表达式的东西,最好自己尝试和学习。查看此 post.
上的链接
希望对您有所帮助。
我正在尝试编写有关增量保存的脚本,但我 运行 遇到了一些小问题。
如果文件名为 "aaa.ma",我将收到以下错误 - ValueError: invalid literal for int() with base 10: 'aaa' #
如果我的文件名为 "aaa_0001"
如果我以这种格式编写代码,就会发生这种情况:Link
所以为了解决上面的问题,我输入了一个if..else..
语句-Link,貌似解决了手头的问题,但我想知道有没有更好的对此的处理方法?
任何建议将不胜感激!
使用正则表达式以获得更好的灵活性,尤其是对于像这样的文件重命名脚本。
在你的情况下,因为你知道预期的文件名格式是 "some_file_name_<increment_number>"
,你可以使用正则表达式为你进行搜索和匹配。我们应该这样做的原因是因为 people/users 可能不是机器,并且可能不遵守我们的脚本期望的确切命名约定。例如,用户可以将文件命名为 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)
。这将确保文件不会被意外保存到自身,并强制 script/user 重命名当前文件。只是一个安全措施。
如果您想对正则表达式进行一些花哨的处理并使它们更具可读性,您可以尝试这样做:
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>...
语法为匹配组分配一个字典键名。在您访问它时提高可读性 - mo.group('version')
比 mo.group(2)
更清晰。
确保也通过 official docs。
使用 Maya 的命令保存。这将确保 Maya 在保存时和保存之前进行所有检查:
cmds.file(rename=incSaveFilePath)
cmds.file(save=True)
更新 2:
如果您想要检查 space,这里是一个更新的正则表达式:
match_object = re.search("(?P<name>[a-zA-Z]*)[_ ]*(?P<version>[0-9]*)$", name)
此处 [_ ]*
将检查 0 - _
或 (space) 的多次出现。对于更多正则表达式的东西,最好自己尝试和学习。查看此 post.
希望对您有所帮助。