Python 对“使用通配符”;如果。。。。在……中“;陈述
我试图在目录中查找文件,其中使用的文件名有时只是完整文件名的一部分 所以 给予 ['ANZMeta.xsl'、'受益地区'、'分区'、'紧急情况', 'Error_LOG.txt'、'hex.dbf'、'hex.shp'、'hex.shp_BaseMetadata.xml', “hex.shx”、“维护区域”、“Rates.mxd”、“规定停车场”, 'schema.ini','服务区','地方政府lnk的快捷方式','选项卡', ‘TRC.rar’、‘TRC_boundary.dbf’、‘TRC_boundary.kml’、‘TRC_boundary.prj’, ‘trc_boundary.sbn’、‘trc_boundary.sbx’、‘trc_boundary.shp’, “trc_boundary.shp.ATGIS29.1772.3444.sr.lock”, 'trc_boundary.shp.ATGIS30.2668.2356.sr.lock','trc_boundary.shp.xml', 'trc_boundary.shx','trc_boundary_Metadata.xml.auto', ‘trc_boundary_Polygon.dbf’、‘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_Polygon.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'] 我想Python 对“使用通配符”;如果。。。。在……中“;陈述,python,string,arcgis,arcpy,Python,String,Arcgis,Arcpy,我试图在目录中查找文件,其中使用的文件名有时只是完整文件名的一部分 所以 给予 ['ANZMeta.xsl'、'受益地区'、'分区'、'紧急情况', 'Error_LOG.txt'、'hex.dbf'、'hex.shp'、'hex.shp_BaseMetadata.xml', “hex.shx”、“维护区域”、“Rates.mxd”、“规定停车场”, 'schema.ini','服务区','地方政府lnk的快捷方式','选项卡', ‘TRC.rar’、‘TRC_boundary.dbf’、‘TR
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函数,因为数据集将具有多个文件扩展名,如tab、ecw等)。有时,相关的xml文件可能被称为Urbanlevy_bdy_trc_Metadata.shp.xml,因此关键是搜索扩展名为.xml的核心文件名“Urbanlevy_bdy_trc”
我如何指定这一点?这项工作的目的已在中提到
完整代码
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)
结果为什么不直接使用:
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]
当然,您也可以使用正则表达式来完成相同的操作。尝试以下操作:
if any(f.startswith(existingXML) and f.endswith('.xml') for f in check_meta):
print "exists"
any()
内置函数将iterable作为参数,如果任何元素为true,则返回true。我们传递的参数是一个生成器表达式,它将为列表中的每个文件f
生成值f.startswith(existingXML)和f.endswith('.xml')
正则表达式解决方案可能如下所示:
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
谢谢…在if any解决方案中,我得到一个IOError:[Errno 2]没有这样的文件或目录:u'Asc_Sewer_catchements.xml'where>>>existingXML u'Asc_Sewer_catchements'--存在于那里的文件是Asc_Sewer_catchements.shp.xmlso@GeorgeC-这很奇怪,那里不应该有任何会引起IOError的东西,您能否编辑您的问题以显示导致错误的代码和完整的异常文本?问题不在于您的代码,而在于下一行如何处理xml的调用。我正在试图找出答案……我们可以让您的“if any”语句吐出它找到的xml文件的名称吗?为此,您需要使用For循环而不是“if any”,我已经用一个示例编辑了我的答案。您应该查看
glob
模块。另外,为什么不使用os.path.splitext()
来获取extension@gnibbler你应该把这写进一个答案;采用这种方法要比尝试使用原始方法好得多。
for f in check_meta:
if f.startswith(existingXML) and f.endswith('.xml'):
print "exists, file name:", f
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]