7.5 Working with web pages using urllib
urllib
Web网页作为GIS工作流的信息来源,一个web地址是一个uniform resource locator,即URL。Python的标准库包括
urllib
包,它由几个模块组成,用于处理URL。本节重点介绍使用
urllib.request
模块打开和读取URL。
Python 2包括用于处理网页的模块urllib、urllib2和urlparse。在Python3中,这些模块被一个名为urllib的包替换,这与Python2中的urllib模块不同。
要打开网页,首先导入
urllib.request
模块,然后使用
urlopen()
函数。打开网页后,可以使用
read()
方法开始读取其内容,如下所示:
import urllib.request
url = urllib.request.urlopen("https://www.esri.com/")
html = url.read()
阅读整个网页并不常见。更典型的场景是从网页下载一个或多个文件。为此,使用
urlretrieve()
函数。此函数的参数是URL和本地文件名称。以下示例下载ZIP 并将其保存为本地文件:
import urllib.request
url = "http://opendata.toronto.ca/gcc/bikeways_wgs84.zip"
file = "bikeways.zip"
urllib.request.urlretrieve(url, file)
本地文件名称可以与正在下载的文件相同,但如果它保持相同的文件扩展名,也可以具有不同的名称。本地文件保存到当前工作目录,通常是脚本的位置。与使用FTP下载文件类似,可以使用
os.chdir()
更改此目录。
某些文件(如TXT或CSV)可以使用
urlopen()
函数直接读取,如下所示:
import urllib.request
url = "https://wordpress.org/plugins/readme.txt"
content = urllib.request.urlopen(url)
for line in content:
print(line)
urllib.request
模块包含相关任务的功能,包括身份验证、使用代理和处理cookie。
urllib包的其他模块包括错误处理和解析URL的功能。尽管urllib提供了打开和阅读网页的强大功能,但广泛推荐的替代方法是requests包,这个包不是标准库的一部分,必须作为包安装,但它是argispro-py3默认环境的一部分。requests包是最流行的Python包之一,已成为处理网页的事实标准。以下示例说明了如何使用
requests
包下载ZIP:
import requests
url = "http://opendata.toronto.ca/gcc/bikeways_wgs84.zip"
file = "bikeways.zip"
response = requests.get(url)
open(file, "wb").write(response.content)
requests模块的
get()
函数创建一个Response对象。这个对象允许您使用内容属性访问网页的内容。为了保存网页的内容,将打开本地文件,并写入内容。与使用urllib相比,这个过程可能显得稍微复杂一些,但Response对象提供了很大的通用性。例如,它可以处理JSON对象,这已成为共享表格和空间数据的流行方式。
7.6 Working with CSV files using csv
csv
纯文本Ales被广泛用于存储和传输数据,但缺乏格式可能会带来困难。因此,共同分隔值(CSV)便产生了作用。CSV 文件是一种纯文本文件,其中值用逗号分隔。CSV比其他形式的纯文本更健壮,因为值之间的分隔符是可预测的,即逗号。
在研究CSV 文件的使用之前,简要回顾一下使用TXT的情况,以显示其异同。处理TXT的一种常见方法是使用
open()
函数,如下所示:
f = open("C:/Data/mytext.txt")
for line in f:
<some task>
f.close( )
这个函数通常用于小文件,但对于大文件则成为一个问题,因为整个文件都被读入内存。一个很好的替代方案是
fileinput
模块,它创建一个对象来遍历for循环中的行,如下所示:
import fileinput
infile = "C:/Data/mytext.txt"
for line in fileinput.input(infile)
<some task>
下面是一个处理文本的更完整的示例。这个例子是相关的,因为相同的脚本用于说明如何使用CSV 文件(在本节中)和Excel 文件(下一节中)<该示例从文本读取坐标以创建点特征。每一行以ID号开头,后跟x坐标和y坐标 三个值用空格隔开,这些坐标存储在名为points.txt的纯文本文件中,如图中所示。
这些坐标用于创建新的点特征,脚本读取文本文件的内容,并使用
split()
方法将每行文本解析为点ID号、x坐标和y坐标的单独值。这些脚本在输入文本文件的行上迭代,并为每行创建一个Point对象,分析代码行创建点特征,用
with
语句可以确保正确的关闭并避免任何数据锁。脚本如下:
import arcpy
fgdb = "C:/Demo/Data.gdb"
infile = "C:/Data/points.txt"
fc = "trees"
sr = arcpy.SpatialReference(26910)
arcpy.env.workspace = fgdb
arcpy.CreateFeatureclass_management(fgdb, fc, "Point", "", "", "", sr)
with arcpy.da.InsertCursor(fc, ["[email protected]"]) as cursor:
point = arcpy.Point()
with open(infile) as f:
for line in f:
point.ID, point.X, point.Y = line.split()
cursor.insertRow([point])
脚本的结果是一个新的要素类,称为具有多个点要素的树。存储在CSV 文件中的相同坐标在遵循相同常规步骤的不同脚本中使用。相同坐标的CSV版本显示在图中。正如预期的那样,值之间的分隔符是逗号,并且没有空格。
在Python中使用CSV 是使用
CSV
模块完成的,
CSV
模块是标准库的一部分。首先导入csv模块,打开csv 文件,然后使用
csv.reader()
函数读取文件的内容,如下所示:
import csv
f = open("C:/Data/test.csv")
for row in csv.reader(f)
<some task>
f.close()
代码看起来类似于使用普通文本文件,但使用csv模块。一个关键区别是如何读取每行(或行)的内容。对于TXT, 必须知道单行文本中值之间的分隔符是什么,并相应地使用split()方法。相反,对于CSV文件,分隔符应该是逗号,因此不需要指定分隔符。相反,当使用
csv.reader()
函数时,值将作为列表返回。以下是完整的脚本 :
import arcpy
import csv
fgdb = "C:/Data/Demo.gdb"
infile = "C:/Data/points.csv"
fc = "trees"
sr = arcpy.SpatialReference(26910)
arcpy.env.workspace = fgdb
arcpy.CreateFeatureclass_management(fgdb, fc, "Point", "", "", "", sr)
with arcpy.da.InsertCursor(fc, ["[email protected]"]) as cursor:
point = arcpy.Point()
with open(infile) as f:
for line in csv.reader(f):
point.ID, point.X, point.Y = line[0], line[1], line[2]
cursor.insertRow([point])
为了清楚,for循环
point.ID, point.X, point.Y = line[0], line[1], line[2]
可以如下修改:
point.ID = line[0]
point.X = line[1]
point.Y = line[2]
正如代码示例所示,这两个脚本之间的差异很细微。通常,与Txt相比,使用CSV文件更稳健,因为它们的格式更可预测。
ArcGIS Pro将CSV文件识别为数据格式。当在“目录”窗格中查看时,CSV 问就按将显示为一个条目,并带有一个指示文本图标,如图中所示。
将csv文件添加到map后,将以表格的形式进行显示。CSV 文件可以直接用于许多使用表作为输入的地质处理工具,包括XY表到点、表到表。当CSV文件不包含带有字段名称的标题行时,将添加默认字段名称,即Field1、Field2等。下图显示了使用CSV 文件作为表输入行源的示例。
注意:ArcGIS Pro可以识别格式正确的TXT(即使用空格或制表符作为分隔符),也可以用于地质处理工具,但它们的鲁棒性较差。
虽然CSV 可以直接在ArcGIS Pro中使用,但在Python中使用它们可以提供更多的灵活性。