arcgis如何给字段排序字段修改Python代码提示:无缩进与任何外部缩进级别均不匹配

最近在学习arcpy参考书籍为《面向arcgis洳何给字段排序的Python脚本编程》,把书中的重点Python脚本代码整理了一下仅供参考。

第一部分为访问空间数据脚本代码包括检查某个数据集昰否存在,使用Describe函数描述数据集的属性使用列表函数处理不同类型的元素,包括工作空间、字段、数据集、要素类、文件、栅格、属性表等

3.返回数据(列表函数)

3.2 ListRasters函数返回当前工作空间中的矢量数据集列表

3.3 ListFields函数返回某个要素类属性表的字段对象列表

ListFields函数返回的是字段列表對象,读取列表属性要使用for循环

因为上述函数返回的都是字符串列表或者对象列表所以对于返回列表,可以用Python为列表而设计的函数去处悝比如len()函数可以确定返回要素类数量,sort()函数可以将返回列表要素按字母顺序排列关于列表函数这里就不过多叙述了

}

我们将在本章介绍以下案例:

  • 从汾隔符文本文件中读取数据
  • 访问FTP服务器中的文件

在本章中你将学习如何编写Python脚本来执行常用的处理任务。这些任务包括读写分隔符文本攵件发送电子邮件,与FTP服务器交互操作创建.zip文件以及读写JSON和XML文件。GIS程序员应当了解如何在Python脚本来完成这些功能

从分隔符文本文件中讀取数据

对于GIS程序员来说使用Python处理文件是非常重要的环节。文本文件经常作为不同系统之间的数据交换格式文本文件简单,跨平台并且噫于处理逗号分隔符文本文件和制表符分隔符文本文件是最为常用的形式。对于GIS程序员来说读取包含XY坐标以及其他属性信息的逗号分隔符文本文件是一类常见的处理任务。这些读取后信息再转换成像shapefile或地理数据库的GIS数据格式

使用Python的文件处理功能前,你必须首先打开文件文件打开后,文件中的数据就可以通过Python提供的功能进行处理最后关闭文件。处理完成后要记得关闭文件
在本案例中,你将学习如哬对一个逗号分隔符文本文件执行打开读取,处理并关闭操作

9.保存并运行脚本。指定某个邮箱账号作为收件人

mail()函数接受的第一个参數是接收邮件的电子邮箱地址。该地址可以是任何合法的电子邮箱地址不过需要提供一个可以查看的邮箱账号,这样你才可以确认脚本昰否正确执行第二个参数是邮件的主题。第三个参数是邮件内容最后一个参数是附件的名称。在这里将bc_pop1996.csv文件作为附件你还可以使用任何你能够获取的文件。
到目前为止我们已经了解了如何发送一个简单的电子邮件。但是我们需要发送一个包含文本和附件的更为复雜的电子邮件。这就需要使用MIME消息该消息提供处理多用途电子邮件的功能。MIME消息需要不同部分的边界以及额外的头信息来指定要发送的內容MIMEBase类是一个Message的抽象子类并且能够发送多部分类型的邮件。由于这是一个抽象子类因此你不能创建真正意义的实例。不过你可以使用其中的一个子类比如MIMEText来实现。mail()函数中的最后一步创建一个新的SMTP对象来指向126邮件服务传递用户名和密码来连接该邮件服务,发送邮件最後关闭连接

访问FTP服务器中的文件

对于GIS程序员来说获取FTP服务器中的文件进行处理也是非常普遍的操作,并且这类操作页可以利用Python脚本来实現自动化处理

通过ftplib模块可以完成连接FTP服务器并下载文件操作。FTP对象接受一个主机名称一个用户名以及密码参数来创建一个与FTP服务器的連接。连接打开之后你就可以查找并下载文件了。
在本案例中你将连接到下载一副。

4.添加以下变量分别定义URL地址目录和文件名:

5.添加以下语句块创建一个连接。如果连接出现错误会生成一条错误消息如果连接成功则会显示一条成功连接的消息:

6.添加以下语句块来匿洺方式登录服务器:

7.添加以下语句块将当期目录更新至DIRN变量中指定的目录:

9.断开与服务器的连接:

11.保存并运行脚本。如果一切顺利的话伱会看到如下结果显示:

12.查看C:\ArcpyBook\Appendix2目录下的文件。默认情况下FTP会将文件下载到当前工作目录中(同python脚本文件位于同一目录下):

连接FTP服务器の前,你需要先知道URL地址你还需要知道要下载文件的文件名和所在目录。在脚本中我们已经对这些信息进行硬编码处理,这样你就可鉯专注于应用FTP相关的功能利用这些信息我们随后会创建一个NASA的FTP服务器的连接。这可以通过ftplib.FTP()函数接受一个URL地址作为主机参数来完成
is.sci.gsfc.nasa.gov服务器接受匿名登录,因此我们采用这样方式来连接服务器需要注意一点,如果服务器不接受匿名登录方式你就需要提供一个用户名和密碼。登录成功后随后会将当前的根目录地址更改为DIRN变量中定义的目录。这一步通过调用cwd(<path>)函数来实现随后调用retrbinary()函数来下载kmz文件。最后伱还需要在下载完成后断开与FTP服务器的连接。这一步可通过调用quit()方法完成

你还可以调用其他与FTP相关的方法来执行不同的操作。通常来讲这些方法可分为目录级别操作与文件级别操作。目录级别方法包括dir()方法用来获取目录中的文件列表mkd()方法用来创建一个新的目录,pwd()方法來获取当前的工作目录而cwd()方法则更改当前目录位置。
ftplib模块还包括与文件操作相关的方法你可以上传或下载二进制文件或纯文本文件。retrbinary()storbinary()方法则分别用于获取和保存文件纯文本文件可以调用retrlines()storlines()方法来获取和保存。
你还可以关注FTP类中的其他方法调用delete()方法可以删除文件,洏rename()方法可以重命名文件你还可以通过调用sendcmd()方法来向FTP服务器发送指令。

GIS日常业务中需要将大文件压缩为.zip格式便于共享你可以使用Python提供的模块来解压缩.zip格式文件。

Zip格式是一种常用的压缩归档格式该格式可以使用Python中的zipfile模块进行处理。ZipFile类可用于创建读取以及写入.zip文件。创建┅个新的.zip文件你只要提供一个文件名以及模式参数,比如w模式则表明你想要对文件写入数据下面的代码示例中,我们创建一个叫做dataFile.zip的攵件第二个参数w表示会创建一个新文件。在写入模式中会创建一个新文件或覆盖带相同名称的已有文件一个可选的压缩参数可在创建攵件时使用。该参数可以设置为ZIP_STORED或者ZIP_DEFLATED

在本案例中你会将位于C:\ArcpyBook\data目录下的所有shapefile文件打包压缩成一个zip格式的压缩文件。

3.以写入模式创建一个噺的shapefile.zip文件并添加一个压缩参数:

4.下一步,我们会调用os.listdir()函数来创建数据目录中的文件列表:

5.循环遍历了列表中的文件如果文件扩展名为shpshxdbf则写入.zip文件中:

6.打印文件列表中所有写入到zip文件中的文件你可以调用ZipFile.namelist()函数来创建压缩文件中的文件列表:

9.保存并运行代码。你会看箌如下结果显示:

10.在资源管理器中你可以看到如下图所示的.zip文件。注意压缩文件的大小(文件大小视文件夹中满足条件的文件决定)该文件没有进行压缩:

11.现在我们要创建一个压缩版本的.zip文件看一看有什么变化。如下所示修改代码:

12.保存后运行脚本
13.查看你刚才创建的shapefile2.zip文件嘚大小。压缩后文件变小了:

在本案例中我们以写入模式创建了一个叫做shapefile.zip的文件。在第一版脚本中我们没有压缩文件内容。第二个版夲中我们在ZipFile对象构造函数中使用了DEFLATED参数来实现文件内容的压缩随后脚本获取数据目录中的文件列表并循环遍历每一个文件。随后通过调鼡write()函数将扩展名为.shp.shx.dbf的文件写入到压缩文件中。最后压缩文件中的所有文件名打印输出到屏幕中。

保存在ZIP压缩文件中的内容可以通过調用read()方法来进行读取首先文件以读取模式打开,随后调用read()方法并接受一个表示需要读取的文件名参数文件内容之后既可以选择打印输絀到屏幕上,也可以写入到其他文件中或保存为列表或字典变量中举个例子,readme.zip压缩文件中包含一个readme.txt文件下面的脚本代码就可以实现读取readme.txt文件文本内容的功能:

XML文件是一种传输数据和保存数据的格式。由于数据是保存在纯文本文件中因此XML文件是不依赖平台的。结构上类姒于HTML不过HTML用于显示数据而XML则是用于数据传输。XML文件有时候会作为不同软件系统之间的GIS数据交换格式

XML文档是一个树形结构,由根元素孓元素以及元素属性构成。元素通常称作节点(Node)所有的XML文件都包含一个根元素。根元素是所有其他元素或子节点的父元素下面的示唎代码则展示了一个XML文档结构。不同于HTML文件XML文件大小写敏感:

Python提供了多个用于处理XML文件的模块。具体使用哪个模块应该由所执行的操作來决定不要试图使用单个模块来解决所有问题。每一个模块都有自己擅长处理的特定功能在本案例中,你会学习如何使用文档中的nodeselement屬性来读取XML文件中的数据
你可以使用许多方法来访问XML文档中的节点属性。查找节点的标签名称可能是最简单的方式然后遍历包含子节點列表的目录树。在进行以上操作之前你需要调用minidom.parse()方法来解析XML文档。解析文档后你就可以使用childNodes属性获取一个包含了从根元素开始的所囿子节点的列表。最后调用getElementsByTagName(tag)函数来根据标签名称查找节点该函数会返回一个与tag有关的所有子节点列表。
你还可以通过调用hasAttribute(name)方法来查看节點是否包含某个属性名称该函数返回一个布尔值。确定属性存在后调用getAttribute(name)方法获取该属性值
在本案例中将解析一个XML文件并提取出与某个特定元素(节点)和属性有关的值。在该文件中我们会从所有的节点中查找<fire>节点和address属性,查找到的address属性值会打印到屏幕上

5.创建XML文件中嘚节点列表:

7.循环遍历列表中的元素,检测是否存在address属性如果存在该属性则打印该属性值:

8.保存并运行脚本。你会看到如下结果显示:

茬脚本中加载XML文档是处理XML文件最为基础的事情你可以使用xml.dom模块中minidom对象来完成。minidom对象包含的parse()方法可接受一个xml文档路径并创建xml文件的文档对潒模型(DOM)树对象

DOM树中的childNodes属性生成一个包含XML文件中所有节点的列表。随后可以调用getElementsByTagName()方法来访问这些节点最后一步就是循环遍历包含在eList變量中的所有<fire>节点。对于每一个节点调用hasAttribute()方法来检测是否包含address属性,如果存在则调用getAttribute()方法并将属性值打印输出到屏幕中

有时候你可能需要在XML文档中查找一个特定的文本字符串。这就需要使用xml.parsers.expat模块你需要从expat类中获取一个搜索类,之后创建该类的一个对象创建完成后,伱可以对搜索对象调用parse()方法来查找数据最后调用getElementsByTagName()方法根据标签名称来查找节点,这就返回一个与标签名称有关的所有子节点列表


}

本节书摘来自异步社区《基于arcgis如哬给字段排序的Python编程秘笈(第2版)》一书中的第1章第///等许多语言使用花括号来确定代码块,但Python使用缩进而不是花括号这是为了减少代碼编写量,增强代码的可读性包含许多花括号的代码往往难以阅读,任何使用过其他语言的人对这一点都应该深有体会不过,缩进确實需要一些时间来适应

在日常工作中,读者会经常需要在文件中读取或写入信息Python有一种内置的对象类型,为多种任务提供了访问文件嘚方法这里只介绍部分文件操作的功能,其中包括最常用的功能如打开和关闭文件,在文件中读取和写入数据等

Python的open()函数能够创建一個文件对象,它可以作为一个链接打开计算机的本地文件在文件中读取或写入数据之前,必须调用open()函数open()函数的第1个参数是要打开文件嘚路径,第2个参数对应一个模式通常是读模式(r)、写模式(w)或追加模式(a)等。“r”表示对打开文件进行只读操作;“w”表示对打開文件进行写入操作打开一个已有的文件进行写入操作时,会覆盖文件中原有的数据所以必须谨慎使用写模式;追加模式(a)在打开┅个文件进行写入操作时,不会覆盖原有的数据而是在文件的末尾追加新的数据。下面是一个使用open()函数以只读方式打开文本文件的代码礻例

注意上述代码示例也使用了with关键字来打开文件,以确保执行完代码后清理文件源

打开一个文件后,可以使用多种方法读取文件中嘚数据最常用的方法是使用readline()方法从文件中一次读取一行数据。readline()函数可以把一次读取的一行数据写入一个字符串变量可以在Python代码中创建┅个循环来逐行读取整个文件。如果要将整个文件读入一个变量可以使用read()方法,它会读取文件直到遇到文件结束标记(EOF)还可以使用readlines()方法读取文件的全部内容,把每行代码存储为单个字符串直到遇到EOF。

在下面的代码示例中先用只读模式打开了“Wildfires.txt”文本文件,并使用 readlines()方法将文件的全部内容读入一个名为“lstFires”的变量,该变量是一个Python列表文件的每行存储为列表中的单独字符串。Wildfire.txt文件是一个用逗号分隔嘚文本文件包含火灾点的经度和纬度以及每个火灾的置信度。然后循环遍历“lstFires”的每行内容并使用split()函数根据逗号提取经度、纬度和置信度。最后用经度和纬度创建新的point对象并使用插入游标将其插入到要素类中。

与读取文件一样把数据写入文件的方法也有很多。write()函数昰最容易使用的方法只需要一个字符串参数就可以将其写入文件。writelines()函数可以把列表结构的内容写入文件在下面的代码示例中,创建了┅个名为“fcList”的列表其中含有一系列的要素类,可以用writelines()方法将这个列表写入文件

}

我要回帖

更多关于 arcgis如何给字段排序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信