# -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-# -*- coding=utf-8 -*-# ==========================================#       author: Ruben#         mail: 773849069@qq.com#         time: 2019/5/10# ==========================================import codecs
# --*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*defcheckMayaAsciiFile(source_file, target_file, log_file):"""
    1. 用于检查 Maya Ascii 文件打开崩溃
    2. - - - - - - - - - - - - - -耗时
    Args:
        source_file: ma 文件
        target_file: 修改后的文件
        log_file: logging
    Returns: none
    """# # 记录打不开的ma文件是从哪一行崩溃的# __startMel = '''python("logFile='%s';ff = open(logFile,'w');ff.write(' ');ff.close();");''' % log_file# __proc = '''python("ff = open(logFile,'a');ff.write('%s - {0}\\\\n'.format(comp_time));ff.close();");\n'''# __endMel = ""# 记录打开文件时的耗时信息
    __startMel ='''python("from datetime import datetime;import time;line_time=datetime.now();time.sleep(0.002);threshold_time=datetime.now() - line_time;start_time=line_time;logging=list();logFile='%s'");'''% log_file
    __proc ='''python("comp_time = datetime.now() - line_time;logging.append('%s - '+ str(comp_time)) if comp_time > threshold_time else None;line_time = datetime.now();");\n'''
    __endMel ='''python("logging.append('\\\\n\\\\nStart Time - '+ str(start_time) + '\\\\nEnd Time - '+ str(line_time) + '\\\\nTotal Time - ' + str(line_time - start_time));ff = open(logFile,'w');[ff.write(line+'\\\\n') for line in logging];ff.close();");'''with codecs.open(source_file,"r","gbk")as f:
        aLines = f.readlines()
    fileter =("select","connectAttr","dataStructure","createNode","requires","currentUnit")# other relationship fileInfo
    rule =1for num, line inenumerate(aLines):
        line_add ="".join([aLines[num -1][:-1], __proc %str(num)])if rule:# 文件开头的 file 每一行都加 melif __startMel:# 文件开头结尾初始化命令
                aLines[num]= __startMel + line
                if __endMel:
                    aLines[num -1]= __endMel + aLines[num -1]
                __startMel =0continueif"file"in line:# 可能有的设置里会有file字符串,所以这里要独立规则if";\n"notin aLines[num -1]:continue
                aLines[num -1]= line_add
            if"requires"in line:# requires 之后改变规则
                rule =0# 在 fileter 参数里的,对它的前一行添加 mel# setAttr 用的是 .attr 的方式,在它之后加 mel 会影响下一个 setAttr 所以这里添加这个过滤for _ in fileter:if _ in line:if";\n"in aLines[num -1]:
                    aLines[num -1]= line_add
    with codecs.open(target_file,"w","gbk")as ff:for lines in aLines:
            ff.write(lines)if __name__ =='__main__':
    srcFile =r"D:\Ruben\aaa.ma"
    srcFile = srcFile.replace("\\","/")
    sourceFile = srcFile
    targetFile = srcFile[:-3]+"_v01.ma"
    logFile = srcFile[:-3]+"_v01.txt"# print(sourceFile, targetFile, logFile)
    checkMayaAsciiFile(sourceFile, targetFile, logFile)

使用方法:传入一份 Maya Ascii 文件,生成一个修改过的文件,从 Maya 里打开这个文件就可以看到 log
文件要是 Maya Binary 格式的话那就没招了

2021.10.25更新

终于有小伙伴评论啦,我还以为大家都看的懂,在此更新一下这个方法的原理,有疑问可以找我讨论!!!

这里提供的的方法只适用于TD排查错误,如果没有TD可以联系我远程协助(尽我所能)
Maya打不开文件的原因有很多,以后我再出个整理吧

原理

这段代码的作用是在ma文件的代码后边添加一句额外的代码(记录当前代码位置)
从Maya中开文件就会执行这些代码,输出代码位置到log文件
打开log找到最后一行数字,这就是ma文件打不开执行中断的地方,如果没有中断,就是最后一行,那**此方法不适用**,请翻阅其他文章
从这里看一下上下文,再去找文件打不开的其他原因

ma 和 mb 文件的区别

ma可以用文本编辑器打开直接看到代码
mb是压缩之后的文件,无法直接看到内容

文本编辑器

Notpad++ 轻量化的文本编辑器,缺点是打不开大文件,超过300MB打开就有些困难
EmEditor 这个可以打开大文件,很方便