是否有任何自动方法可以从PC提取有关GIS数据的所有信息(即shapefile,arc-info coverage,图层文件,*。mxd,gdb,栅格文件等)到Excel文件?该信息可能包括创建日期,最后编辑日期,文件夹或容器名称等。
#1 楼
使用ArcGIS 10.1 SP1中的arcpy.da.Walk
函数,这对我有用: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
函数以获取可包含在输出中的其他属性。实际元数据中的信息,请参见此答案中的脚本:在文件地理数据库中创建包含所有文件名(可能还有元数据)的表评论
@ blah239,excel也可以打开文本文件,只需要提供分隔符即可。
–artwork21
2013年1月20日15:21
是的,但是Excel CSV方言可以解决所有棘手的问题,例如嵌入式引号,换行符和逗号。它也不需要通过向导即可打开文件。
–blah238
2013年1月20日15:34
thx的澄清。
–artwork21
2013年1月20日15:41
#2 楼
使用Python时,必须使用正确的模块来完成所需的操作。例如,要查找扩展名为shp的目录中的所有文件,提供了许多更简单的解决方案,而且没有间断,这很糟糕...(这是Nathan W提出的解决方案,但是还有很多很多,只需在Internet上搜索即可)
带有相关模块的一些示例:
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和列表理解(两行)->结果列表
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
以及许多其他解决方案,递归等。
评论
如何使用“ * .shp”方法忽略.shp.xml文件?
–artwork21
2013年1月20日15:18
你试过了吗? glob.glob(“ *。shp”)最终不会返回.shp.xml文件。
–blah238
2013年1月20日15:37
@ blah238,没有,没有尝试,谢谢。
–artwork21
2013年1月20日15:40
#3 楼
感谢Artwork21和Nathan W的回复。是的,Nathen的代码使魔术成为了魔术。我要使用的PC具有很多覆盖率(arc-info文件)文件,它也可以在它们上工作吗?评论
至于我的软件版本,我使用的是AG 10.1 SP1,但其他电脑使用的是ESRI软件的各种版本-主要是Arc info。
– blu_sr
13年1月20日在10:23
我实际上不确定arcpy.da.walk是否会列出coverage,但是我猜不会,因为它未在dataType或类型过滤器中列出。
–blah238
13年1月20日在10:32
这是代码的较短版本:gist.github.com/4577289。由于shp,lyr和img的逻辑相同,因此我们只需在一个if语句中进行操作即可。
–内森·W
13年1月20日在11:58
如果使用with,则也不需要txt.close(),因为它将在块退出时为您执行此操作。
–内森·W
13年1月20日在11:58
#4 楼
如果您拥有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(或更高版本)用于桌面,则这里还有另一个答案使用的arcpy.da.Walk在10.0或更早版本上不可用。
评论
您可能需要检查代码。只有先找到形状,它才会搜索gdb。压痕似乎一团糟。
–内森·W
13年1月20日在8:20
我也没有f.find是这里的正确用法。最好这样写:gist.github.com/4577289当然未经测试。
–内森·W
13年1月20日在8:29
不要以为f.find **
–内森·W
2013年1月20日9:41
其他简化方法包括使用csv模块将文件抽象化,并使用10.1 SP1的arcpy.da.walk让ArcGIS处理列出的GIS数据类型。
–blah238
13年1月20日在10:07
谢谢!我正在努力从那个古老的数据库中提取尽可能多的信息。
– blu_sr
13年1月20日在10:35
#5 楼
如果要避免编程,这可能是最简单,最快的方法。Excel中有一个名为ASAP Utilities的附加程序。有90天的免费试用期,但在此之后,商务用途的费用为49美元。它是免费的,供学生或个人使用。该插件添加了许多有用的功能。其中之一是在文件夹结构中创建文件列表。它还提供文件属性。您可以根据需要限制文件类型的结果。
这里有一个有关如何执行此操作的视频。
我以前用过此加载项,结果是非常快。
注意,我与该软件公司无关。
评论
Thnx Fezter,但我认为它不会像以前那样获取GIS文件类型。 .shp不仅仅是.shp,它还有许多其他文件。
– blu_sr
13年1月21日,下午3:57
它可以获取文件夹中的所有文件类型。
– Fezter♦
13年1月21日在4:26
@Fetzer除非它知道如何从文件和个人地理数据库中读取GIS数据集,否则如果在这里使用它,我会感到很惊讶,因为每个文件和每个数据集之间都没有真正的关联
–尼克桑
13年1月22日在20:55
哦,是的,你是对的。我想念您拥有地理数据库。这对您不起作用。对于那个很抱歉。但是,无论如何这都是一个很好的插件。
– Fezter♦
13年1月22日在22:40
#6 楼
我无法获得其他答案才能充分发挥作用。在第一个示例中,在同时包含地理数据库和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...]
这样做的时候,我得到了完整的清单。
评论
您使用的是什么版本的ArcGIS?在10.1 SP1上,arcpy.da.walk使其变得更加容易。在开始使用python攻击旧服务器之前,先进行可视化清单并草绘设计,这永远不会伤害您。
作为对@Roy的回应-您可以考虑从以下免费下载开始:voyagergis.com
您可能还会考虑元数据搜索门户,例如Esri的免费Geoportal Server