我的办公室的GIS部分将发生巨大变化。该部分自1980年代以来一直可操作,并且具有大量的GIS数据(即shapefile,栅格文件,数据等),但从未经过任何清单。现在它将发生。
是否有任何自动方式可以将PC上有关GIS数据的所有信息(即shapefile,arc-info coverage,图层文件,*。mxd,gdb,栅格文件等)提取出来?该信息可能包括创建日期,最后编辑日期,文件夹或容器名称等。
我的办公室的GIS部分将发生巨大变化。该部分自1980年代以来一直可操作,并且具有大量的GIS数据(即shapefile,栅格文件,数据等),但从未经过任何清单。现在它将发生。
是否有任何自动方式可以将PC上有关GIS数据的所有信息(即shapefile,arc-info coverage,图层文件,*。mxd,gdb,栅格文件等)提取出来?该信息可能包括创建日期,最后编辑日期,文件夹或容器名称等。
Answers:
使用arcpy.da.Walk
ArcGIS 10.1 SP1 的功能,这对我有用:
import arcpy, csv, os
workspace = r"c:\GISData"
output = r"C:\temp\test.csv"
with open(output, 'wb') as csvfile:
csvwriter = csv.writer(csvfile)
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace):
for filename in filenames:
desc = arcpy.Describe(os.path.join(dirpath, filename))
csvwriter.writerow([desc.catalogPath, desc.name, desc.dataType])
该csv
模块还用于简化写入输出文件。Excel可以打开CSV文件,因此您可以将其作为电子表格进行查看。
有关arcpy.Describe
可包含在输出中的其他属性,请参见该函数。
如果您特别想从实际的元数据中解析信息,请参见此答案中的脚本:在文件地理数据库中创建包含所有文件名(可能还有元数据)的表
使用Python时,必须使用正确的模块来执行所需的操作。例如,要查找扩展名为shp的目录中的所有文件,提供了许多简单的解决方案,而没有间断,这真是太糟糕了……(就像Nathan W提出的解决方案一样,但是还有很多很多其他解决方案,在互联网上搜索)
有关模块的一些示例:
1)使用glob模块:
仅shapefile:
import glob
import os
os.chdir("mydir")
for files in glob.glob("*.shp"):
print files
shapefile和地理数据库:
import glob
types = ('*.shp', '*.gbd') # the tuple of file types
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(files)) #files_grabbed = the list of shp and gbd files
如果还要在子目录中搜索:
import glob
for f in glob.iglob("/mydir/*/*.shp"): #search immediate subdirectories
print f
2)使用os.listdir和list理解(两行)->结果列表
path = 'mydir'
shape_files = [f for f in os.listdir(path) if f.endswith('.shp')]
gdb_files = [f for f in os.listdir(path) if f.endswith('.gdb')]
3)带fnmatch模块:
import fnmatch
for file in os.listdir('path'):
if fnmatch.fnmatch(file, '*.shp'):
print file
以及其他许多解决方案,递归等
感谢Artwork21和Nathan W的回复。是的,Nathen的代码使神奇。
import os, arcpy
#create blank text file
with open("C:\\Temp\\GISlayers.txt", "w") as txt:
for root, dirs, files in os.walk("C:\\Temp\\temp"):
for f in files:
#look for shapefiles
if f.endswith('.shp'):
desc = arcpy.Describe(root + "\\" + f)
#write info to text file
txt.write(desc.name + "," + desc.catalogPath + "\n")
#look for file geodatabases
if f.endswith('.gdb'):
desc = arcpy.Describe(root)
for child in desc.children:
#write info to text file
txt.write(child.name + "," + child.path + "\n")
#look for layer files
if f.endswith('.lyr'):
desc = arcpy.Describe(root + "\\" + f)
#write info to text file
txt.write(desc.name + "," + desc.catalogPath + "\n")
#look for img file
if f.endswith('.img'):
desc = arcpy.Describe(root + "\\" + f)
#write info to text file
txt.write(desc.name + "," + desc.catalogPath + "\n")
仅文件名和位置。我要使用的PC具有很多coverage(arc-info文件)文件,它也可以在它们上工作吗?
arcpy.da.walk
会列出coverage,但是我猜不会,因为它未在dataType或type过滤器中列出。
if
语句中进行操作即可。
txt.close()
如果您正在使用,也不需要,with
因为当块退出时,它将为您执行此操作。
如果您拥有ArcGIS Desktop 10.0(或其任何Service Pack),我认为最好的办法就是编写一个python脚本,该脚本使用os.walk来浏览已定义的GIS目录并搜索通用的GIS文件扩展名,例如.shp,。 gdb,.mdb等...并将结果写入以逗号分隔的文本文件中。然后,您可以将文本文件导入excel,请参见下面的代码示例:
import os, arcpy
#create blank text file
txt = open("C:\\Temp\\GISlayers.txt", "w")
for root, dirs, files in os.walk("C:\\Temp\\temp"):
for f in files:
#look for shapefiles
foundSHP = f.find(".shp")
if foundSHP >0:
checkEXT = f[-3:]
if checkEXT <> "xml":
desc = arcpy.Describe(root + "\\" + f)
#write info to text file
txt.write(desc.name + "," + desc.catalogPath + "\n")
#look for file geodatabases
foundGDB = f.find(".gdb")
if foundGDB >0:
desc = arcpy.Describe(root)
for child in desc.children:
#write info to text file
txt.write(child.name + "," + child.path + "\n")
break
txt.close()
如果您使用的是ArcGIS 10.1(或更高版本)的Desktop,则此处还有另一个使用arcpy.da.Walk的答案,该答案在10.0或更早版本中不可用。
csv
模块对文件进行抽象写入,以及使用arcpy.da.walk
10.1 SP1来让ArcGIS处理列出的GIS数据类型。
如果要避免编程,这可能是最简单,最快的方法。
Excel中有一个名为ASAP Utilities的附加程序。有90天的免费试用期,但在此之后,商务用途的费用为49美元。它是免费的,供学生或个人使用。该插件增加了许多有用的功能。其中之一是在文件夹结构中创建文件列表。它还提供文件属性。如果需要,可以按文件类型限制结果。
这是有关如何执行此操作的视频。
我以前使用过此加载项,结果很快。
请注意,我与该软件公司无关。
我无法获得其他答案才能充分发挥作用。
在第一个示例中,在同时包含地理数据库和shapefile的目录中,我只获得了地理数据库中要素类的列表,但是当我注释掉脚本的地理数据库部分时,便获得了shapefile列表。
在第二个示例中,地理数据库部分根本不起作用,因此我在第一个示例的地理数据库部分中进行了复制。同样,我得到了仅地理数据库的列表。
然后让我大吃一惊:先读取地理数据库,然后再读取shapefile,然后脚本停止在break
地理数据库部分中的。
作为python新手,我不知道为什么break
需要它,但是如果没有它,脚本似乎会陷入无尽的循环,但是由于这break
是必需的,因此我想到将地理数据库部分放在另一个文件之后的自己的循环中列出类型,将解决问题:
#create blank text file
with open("C:\\Temp\\GISlayers.txt", "w") as txt:
for root, dirs, files in os.walk("C:\\Temp\\temp"):
for f in files:
#look for shapefiles, etc.
[code...]
for f in files:
#look for geodatabases
[code...]
当我这样做的时候,我得到了完整的清单。
arcpy.da.walk
。