20-4-第七章 用于地理处理的基本Python模块和包 (4)

7.5 Working with web pages using 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

纯文本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, ["SHAPE@"]) 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, ["SHAPE@"]) 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中使用它们可以提供更多的灵活性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值