Skip to main content
 首页 » 编程设计

python之AttributeError : __len__ Error with ntpath. py 和 Tkinter.py

2025年05月04日14emanlee

当我运行脚本并更改目录时出现以下错误 - 我该如何修复此错误?

Traceback (most recent call last): File "L:\Data_Admin\QA\Metadata_python_toolset\test2\update_Metadata1e.py", line 17, in currentPath=os.path.join(root,directory) File "C:\Python26\ArcGIS10.0\lib\ntpath.py", line 96, in join assert len(path) > 0 File "C:\Python26\ArcGIS10.0\lib\lib-tk\Tkinter.py", line 1722, in getattr return getattr(self.tk, attr) AttributeError: len

完整代码

import os, xml, arcpy, shutil, datetime, Tkinter,tkFileDialog 
from xml.etree import ElementTree as et  
 
path=os.getcwd() 
RootDirectory=path 
arcpy.env.workspace = path 
Count=0 
 
Generated_XMLs=RootDirectory+'\GeneratedXML_LOG.txt' 
f = open(Generated_XMLs, 'a') 
f.write("Log of Metadata Creation Process - Update: "+str(datetime.datetime.now())+"\n") 
f.close() 
 
for root, dirs, files in os.walk(RootDirectory, topdown=False): 
    #print root, dirs 
    for directory in dirs: 
        currentPath=os.path.join(root,directory) 
        os.chdir(currentPath) 
        arcpy.env.workspace = currentPath 
        print currentPath 
#def Create_xml(currentPath): 
 
        FileList = arcpy.ListFeatureClasses() 
        zone="_Zone" 
 
        for File in FileList: 
            Count+=1 
            FileDesc_obj = arcpy.Describe(File) 
            FileNm=FileDesc_obj.file 
            check_meta=os.listdir(currentPath) 
            existingXML=FileNm[:FileNm.find('.')] 
            existingExtension=FileNm[FileNm.find('.'):] 
            print "XML: "+existingXML 
            #print check_meta 
            #if  existingXML+'.xml' in check_meta: 
            #newMetaFile='new' 
            for f in check_meta: 
                if f.startswith(existingXML) and f.endswith('.xml'): 
                    print "exists, file name:", f 
                    newMetaFile=FileNm+"_2012Metadata.xml" 
                    shutil.copy2(f, newMetaFile) 
                    break 
                else: 
                    #print "Does not exist" 
                    newMetaFile=FileNm+"_BaseMetadata.xml" 
 
            print "New meta file: "+newMetaFile+ " for: "+File 
            if newMetaFile.endswith('_BaseMetadata.xml'):         
                print "calling tkinter" 
                root = Tkinter.Tk() 
                file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a xml base file to match with: '+File) 
                if file != None: 
                    metafile=os.path.abspath(file.name) 
                    file.close() 
                    #print metafile 
                    shutil.copy2(metafile,newMetaFile) 
                    print "copied"+metafile 
                    root.destroy 
 
                else: 
                    shutil.copy2('L:\Data_Admin\QA\Metadata_python_toolset\Master_Metadata.xml', newMetaFile) 
 
 
            print "Parsing meta file: "+newMetaFile 
            tree=et.parse(newMetaFile)         
            print "Processing: "+str(File) 
 
            for node in tree.findall('.//title'): 
                node.text = str(FileNm) 
            for node in tree.findall('.//northbc'): 
                node.text = str(FileDesc_obj.extent.YMax) 
            for node in tree.findall('.//southbc'): 
                node.text = str(FileDesc_obj.extent.YMin) 
            for node in tree.findall('.//westbc'): 
                node.text = str(FileDesc_obj.extent.XMin) 
            for node in tree.findall('.//eastbc'): 
                node.text = str(FileDesc_obj.extent.XMax)         
            for node in tree.findall('.//native/nondig/formname'): 
                node.text = str(os.getcwd()+"\\"+File) 
            for node in tree.findall('.//native/digform/formname'): 
                node.text = str(FileDesc_obj.featureType) 
            for node in tree.findall('.//avlform/nondig/formname'): 
                node.text = str(FileDesc_obj.extension) 
            for node in tree.findall('.//avlform/digform/formname'): 
                node.text = str(float(os.path.getsize(File))/int(1024))+" KB" 
            for node in tree.findall('.//theme'): 
                node.text = str(FileDesc_obj.spatialReference.name +" ; EPSG: "+str(FileDesc_obj.spatialReference.factoryCode)) 
            print node.text 
            projection_info=[] 
            Zone=FileDesc_obj.spatialReference.name 
 
            if "GCS" in str(FileDesc_obj.spatialReference.name): 
                projection_info=[FileDesc_obj.spatialReference.GCSName, FileDesc_obj.spatialReference.angularUnitName, FileDesc_obj.spatialReference.datumName, FileDesc_obj.spatialReference.spheroidName] 
                print "Geographic Coordinate system" 
            else: 
                projection_info=[FileDesc_obj.spatialReference.datumName, FileDesc_obj.spatialReference.spheroidName, FileDesc_obj.spatialReference.angularUnitName, Zone[Zone.rfind(zone)-3:]] 
                print "Projected Coordinate system" 
            x=0 
            for node in tree.findall('.//spdom'): 
                for node2 in node.findall('.//keyword'): 
                    print node2.text 
                    node2.text = str(projection_info[x]) 
                    print node2.text 
                    x=x+1 
 
 
            tree.write(newMetaFile) 
 
            f = open(Generated_XMLs, 'a') 
            f.write(str(Count)+": "+File+"; "+newMetaFile+"; "+currentPath+"\n") 
            f.close() 
 
        print "change dir 1" 
    print "change dir 2" 
 
 
    #        Create_xml(currentPath) 

请您参考如下方法:

您的 os.chdir 可能混淆了 os.walk。尝试在下一次迭代之前恢复工作目录。

更好的是,如果您为 chdir 定义上下文管理器,则可以使用 with 语句。 Here's an example ,它定义了 chdir 的一个版本,您可以按如下方式使用它:

  for root, dirs, files in os.walk(RootDirectory, topdown=False): 
    for directory in dirs: 
      currentPath=os.path.join(root,directory) 
      with chdir(currentPath): 
        # now inside the specified directory 
        # after exiting 'with', original directory will be restored