2

使用されているファイル名が完全なファイル名の一部にすぎないディレクトリでファイルを検索しようとしています。

そう

check_meta=os.listdir(currentPath)

与える

「trc_boundary_Polygon.prj」、「trc_boundary_Polygon.sbn」、「trc_boundary_Polygon.sbx」、「trc_boundary_Polygon.shp」、「trc_boundary_Polygon.shp.ATGIS29.1772.3444.sr.lock」、「trc_boundary_Polygon.shx」、「trc_boundary」xml、「ポリゴン」。 Urbanlevy_bdy_region.dbf'、'Urbanlevy_bdy_region.prj'、'Urbanlevy_bdy_region.shp'、'Urbanlevy_bdy_region.shp.xml'、'Urbanlevy_bdy_region.shx'、'Urbanlevy_bdy_trc.dbf'、'Urbanlevy_bdy_trc. prj', 'Urbanlevy_bdy_trc.sbn', 'Urbanlevy_bdy_trc.sbx', 'Urbanlevy_bdy_trc.shp', 'Urbanlevy_bdy_trc.shp.xml', 'Urbanlevy_bdy_trc.shx'] trc_boundary_Polygon.shp.ATGIS29.1772.3444.sr.lock'、'trc_boundary_Polygon.shx'、'trc_boundary_polygon.xml'、'Urbanlevy_bdy_region.dbf'、'Urbanlevy_bdy_region.prj'、'Urbanlevy_bdy_region.shp'、'Urbanlevy_bdy_region.xml' 、「Urbanlevy_bdy_region.shx」、「Urbanlevy_bdy_trc.dbf」、「Urbanlevy_bdy_trc. prj', 'Urbanlevy_bdy_trc.sbn', 'Urbanlevy_bdy_trc.sbx', 'Urbanlevy_bdy_trc.shp', 'Urbanlevy_bdy_trc.shp.xml', 'Urbanlevy_bdy_trc.shx'] trc_boundary_Polygon.shp.ATGIS29.1772.3444.sr.lock'、'trc_boundary_Polygon.shx'、'trc_boundary_polygon.xml'、'Urbanlevy_bdy_region.dbf'、'Urbanlevy_bdy_region.prj'、'Urbanlevy_bdy_region.shp'、'Urbanlevy_bdy_region.xml' 、「Urbanlevy_bdy_region.shx」、「Urbanlevy_bdy_trc.dbf」、「Urbanlevy_bdy_trc. prj', 'Urbanlevy_bdy_trc.sbn', 'Urbanlevy_bdy_trc.sbx', 'Urbanlevy_bdy_trc.shp', 'Urbanlevy_bdy_trc.shp.xml', 'Urbanlevy_bdy_trc.shx'] shx'、'Urbanlevy_bdy_trc.dbf'、'Urbanlevy_bdy_trc. prj', 'Urbanlevy_bdy_trc.sbn', 'Urbanlevy_bdy_trc.sbx', 'Urbanlevy_bdy_trc.shp', 'Urbanlevy_bdy_trc.shp.xml', 'Urbanlevy_bdy_trc.shx'] shx'、'Urbanlevy_bdy_trc.dbf'、'Urbanlevy_bdy_trc. prj', 'Urbanlevy_bdy_trc.sbn', 'Urbanlevy_bdy_trc.sbx', 'Urbanlevy_bdy_trc.shp', 'Urbanlevy_bdy_trc.shp.xml', 'Urbanlevy_bdy_trc.shx']

したい

existingXML=FileNm[:FileNm.find('.')]
if  existingXML+"*"+'.xml' in check_meta: # this is where the issue is
   print "exists"

そのため、使用する xml が Urbanlevy_bdy_trc.shp.xml である場合もあれば、Urbanlevy_bdy_trc.xml である場合もあります (どちらが存在するかに注意してください。タブのような複数のファイル拡張子があるため、「.shp.xml」に対して単に OR 関数を使用しないことに注意してください。データセットに含まれる ecw など)。また、関連する xml ファイルが Urbanlevy_bdy_trc_Metadata.shp.xml と呼ばれることがあるため、重要なのはコア ファイル名「Urbanlevy_bdy_trc」を拡張子 .xml で検索することです。

これを指定するにはどうすればよいですか?この目的は、Python を使用して xml/text ファイル内の複数の行を検索して置換するに記載されています。

完全なコード

import os, xml, arcpy, shutil, datetime
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
            print FileNm

            check_meta=os.listdir(currentPath)
            existingXML=FileNm[:FileNm.find('.')]
            print "XML: "+existingXML
            print check_meta
            #if  existingXML+'.xml' in check_meta:
            if any(f.startswith(existingXML) and f.endswith('.xml') for f in check_meta):
                print "exists"
                newMetaFile=FileNm+"_2012Metadata.xml"
                shutil.copy2(FileNm+'.xml', newMetaFile)
            else:
                print "Does not exist"
                newMetaFile=FileNm+"_BaseMetadata.xml"
                shutil.copy2('L:\Data_Admin\QA\Metadata_python_toolset\Master_Metadata.xml', 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()



    #        Create_xml(currentPath)

結果

4

3 に答える 3

1

なぜ使用しないのですか:

searchtext = "sometext"
matching = [ f for f in os.listdir(currentPath) if f.startswith(searchtext) and ".xml" in f]

さまざまな拡張子を確認したい場合は、それらを一覧表示できます。

exts = (".xml", ".tab", ".shp")
matching = [ f for f in os.listdir(currentPath) if f.startswith(searchtext) and os.path.splitext(f)[-1] in exts]

もちろん、同じことを行う正規表現を理解することもできます。

于 2012-01-31T04:29:00.757 に答える
0
import fnmatch, posixpath

existingXML   = posixpath.splitext(FileNm)[-1]
matchingFiles = fnmatch.filter(check_meta, existingXML + "*" + ".xml")

if not matchingFiles:
    raise IOError("no matching XML files")
elif len(matchingFiles) > 1:
    print "more than one matching file, using first"
    matchingFile = matchingFiles[0]
else:   # only one was found, just use it
    matchingFile = matchingFiles[0]
于 2012-01-31T07:17:03.507 に答える
0

次のことを試してください。

if any(f.startswith(existingXML) and f.endswith('.xml') for f in check_meta):
   print "exists"

組み込み関数はany()iterable を引数として取り、いずれかの要素が true の場合に true を返します。渡す引数は、リスト内f.startswith(existingXML) and f.endswith('.xml')の各ファイルの値を生成するジェネレータ式です。fcheck_meta

正規表現ソリューションは次のようになります。

regex = re.compile(re.escape(existingXML) + '.*\.xml$')
if any(regex.match(f) for f in check_meta):
    print "exists"

どのエントリが実際に一致するかを知る必要がある場合は、代わりに for ループを使用します。

for f in check_meta:
    if f.startswith(existingXML) and f.endswith('.xml'):
        print "exists, file name:", f
于 2012-01-31T04:40:21.713 に答える