利用sentinel hub Python开发包查询和下载Sentinel-2等卫星遥感数据

简介: 国外卫星数据的下载一直是国内用户的一个问题。本文主要以sentinel hub实现sentinel系列卫星数据的下载。

利用sentinel hub Python开发包查询和下载Sentinel-2等卫星遥感数据

1. 描述

  sentinelhub Python包支持用户利用两种方式进行卫星遥感数据的下载和处理。第一种方式是使用OGC(WMS和WCS)Web请求,它支持Sentinel-2 L1C和L2A,Sentinel-1,Landsat 8,MODIS和DEM数据源。第二种方式是支持从AWS(Amazon Web Service)上获取数据。它可以使用Sentinel-2 L1C图像从公共存储桶提供数据,也可以使用Sentinel-2 L2A图像向请求者支付存储桶。如果指定,下载的数据可以以ESA .SAFE格式存储(支持所有类型的.SAFE格式)。

2. 安装

  安装要求python 版本 >= 3.5,并且安装有C/C++编译器,可以使用pypi 包管理器进行安装。

 $ pip install sentinelhub --upgrade

  也可以通过clone 代码仓进行手动安装

$ python setup.py build    
$ python setup.py install

3. 开发包特性

3.1 OGC web 服务

  一些主要的功能与一个Sentinel Hub账号相关联:

  • 使用Sentinel Hub帐户支持Web地图服务(WMS)和Web Coverage服务(WCS)请求;
  • 支持标准和自定义多光谱图层,例如未处理的波段,真彩色图像或NDVI;
  • 支持多时间请求;
  • 支持云覆盖过滤;
  • 支持不同的坐标参考系统;
  • 支持以最常见的图像和数据格式读取和写入下载的数据到磁盘;
  • 支持各种数据源:

    • Sentinel-2 L1C
    • Sentinel-2 L2A
    • Sentinel-1,
    • Landsat 8,
    • MODIS,
    • DEM。

      3.2 AWS 数据下载

        该软件包允许从AWS上的Sentinel-2下载Sentinel-2数据,并将数据重建为ESA .SAFE格式。
      实施以下内容:
  • 支持Sentinel-2 L1C和Sentinel-2 L2A数据;

  • 支持新旧(即紧凑).SAFE格式;
  • 仅支持下载整个产品或.SAFE结构图;
  • 支持命令行条目;
  • 可调整的线程下载,以及现有数据的可选重新下载(非默认);
  • 需要S-2产品ID或产品的图块名称和日期。
  • 如果是Sentinel-2 L2A数据,则需要AWS访问密钥。

4 从AWS上获取卫星数据示例

  该示例说明如何从AWS S3存储桶上获取Sentinel-2影像和其他卫星数据。AWS上提供的数据与ESA提供的S-2数据完全相同。Sentinelhub包支持通过制定产品ID或者指定切片的形式获取数据。它可以将数据下载到与AWS相同的文件结构(S3),也可以将数据下载到ESA的.SAFE文件结构中。

4.1 配置信息

4.1.1 配置

  主要配置AWS的凭据信息。开发包安装完后会有一个配置文件config.json。用户可以在终端命令行中输入如下命令查询配置参数:

$ sentinelhub.config --show

4.1.2 Sentinel Hub 功能配置

  如果需要使用Sentinel Hub的服务,必须先配置instance_id参数。instance_id需要在Sentinel hub services上进行注册申请。通过以下命令设置Sentinel Hub instance ID:

$ sentinelhub.config --instance_id <your instance id>

  通过这样做,包将使用这个实例ID与Sentinel Hub进行交互,除非您有意在代码中指定一个不同的实例ID。

4.1.3 亚马逊S3功能配置

  开发包从亚马逊S3存储桶中下载Sentinel-2 L1C和L2A数据。这些数据存在请求付费的存储桶中,因此在使用S3相关功能时需要AWS认证。通过在命令行中的以下命令进行aws_access_key_idaws_secret_access_key参数的设置。

$ sentinelhub.config --aws_access_key_id <your access key> --aws_secret_access_key <your secret access key>

  如果没有设置认证,则包将自动尝试使用本地存储的AWS认证(如果这些认证是根据AWS配置说明配置的)。任何其他配置参数(例如区域)也将以同样的方式收集。
  AWS凭据还必须具有正确的权限才能从S3 bucket下载数据。可以在AWS IAM控制台中配置。配置足够权限的方法有很多,其中之一就是将其设置为AmazonS3ReadOnlyAccess.
  重要提示:因为S3中的卫星数据包含在请求者付费桶中,Amazon将根据Amazon S3的价格向用户收取下载费用。在这种情况下,用户需要根据下载的数据量和请求数付费。sentinelhub包最多会为每个下载的文件发出一个GET请求。文件的元数据。xml, tileInfo。json和productInfo。json将从Sentinel Hub公共存储库免费获得。

4.2 查询可用的数据

  AWS的Sentinel-2数据存档包含两个存储桶,一个包含L1C,另一个包含L2A数据。有三种方法可以搜索存档以查找特定的切片和影像产品:

4.2.1 使用aws_cli手动检索

  终端中输入以下命令:

aws s3 ls s3://sentinel-s2-l2a/tiles/33/U/WR/ --request-payer

4.2.2 手动搜索

  直接通过浏览器编辑url并打开,不需要身份验证,例如:下载Sentinel-2 2017年1月14日L1C级产品瓦片1 C CV数据产品。

  该方法返回一个包含有数据下载信息的文件
image

4.2.3 使用Sentinel Hub Web Feature

  Service(WFS)按位置和时间间隔自动检索(注意:对于此功能,必须根据配置段落配置Sentinel Hub实例ID 。该实例ID需要在Sentinel hub上进行注册。):

from sentinelhub import WebFeatureService, BBox, CRS, DataSource   

INSTANCE_ID = ''  # In case you put instance ID into cofniguration file you can leave this unchanged      

search_bbox = BBox(bbox=[46.16, -16.15, 46.51, -15.58], crs=CRS.WGS84)      

search_time_interval = ('2017-12-01T00:00:00', '2017-12-15T23:59:59')      

wfs_iterator = WebFeatureService(search_bbox, search_time_interval,     
                                 data_source=DataSource.SENTINEL2_L1C,     
                                 maxcc=1.0, instance_id=INSTANCE_ID)  
for tile_info in wfs_iterator:
    print(tile_info)
{'properties':{'path':'s3:// sentinel-s2-l1c / tiles / 38 / L / PH / 2017/12/15/0','time':'07:12:03', 'id':'S2B_OPER_MSI_L1C_TL_MTI__20171215T085654_A004050_T38LPH_N02.06','cloudCoverPercentage':28.27,'mbr':'600000,8190220 709800,8300020','date':'2017-12-15','crs':'EPSG:32738' },'type':'Feature','geometry':{'type':'MultiPolygon','crs':{'properties':{'name':'urn:ogc:def:crs:EPSG :: 4326 '},'type':'name'},'coordinates':[[[[45.931783967,-15.374656929],[46.954538568,-15.368029755],[46.964123606,-16.360077552],[45.936356187,-16.367155102],[45.931783967, -15.374656929]]]]}}
{'properties':{'path':'s3:// sentinel-s2-l1c / tiles / 38 / L / PH / 2017/12/10/'','time':'07:12:10', 'id':'S2A_OPER_MSI_L1C_TL_SGS__20171210T103113_A012887_T38LPH_N02.06','cloudCoverPercentage':94.02,'mbr':'600000,8190220 709800,8300020','date':'2017-12-10','crs':'EPSG:32738' },'type':'Feature','geometry':{'type':'MultiPolygon','crs':{'properties':{'name':'urn:ogc:def:crs:EPSG :: 4326 '},'type':'name'},'coordinates':[[[[45.931783967,-15.374656929],[46.954538568,-15.368029755],[46.964123606,-16.360077552],[45.936356187,-16.367155102],[45.931783967, -15.374656929]]]]}}
{'properties':{'path':'s3:// sentinel-s2-l1c / tiles / 38 / L / PH / 2017/12/5/0','time':'07:13:30', 'id':'S2B_OPER_MSI_L1C_TL_SGS__20171205T102636_A003907_T38LPH_N02.06','cloudCoverPercentage':91.74,'mbr':'600000,8190220 709800,8300020','date':'2017-12-05','crs':'EPSG:32738' },'type':'Feature','geometry':{'type':'MultiPolygon','crs':{'properties':{'name':'urn:ogc:def:crs:EPSG :: 4326 '},'type':'name'},'coordinates':[[[[45.931783967,-15.374656929],[46.954538568,-15.368029755],[46.964123606,-16.360077552],[45.936356187,-16.367155102],[45.931783967, -15.374656929]]]]}}

  从获得的WFS迭代器中,我们可以提取唯一定义每个tile的信息。

wfs_iterator.get_tiles()

[('38LPH', '2017-12-15', 0),
('38LPH', '2017-12-10', 0),
('38LPH', '2017-12-5', 0)]

4.2.4 使用sentinelhub.opensearch模块中的函数自动搜索

  该方法不需要身份验证。返回一个包含有瓦片信息字典的列表。瓦片信息字典中的关键字properties子字典中包含瓦片数据的信息,比如数据集名称、产品ID、云量信息等。以下打印出的查询到的瓦片信息结果。

from sentinelhub import get_area_info      
for tile_info in get_area_info(search_bbox, search_time_interval, maxcc=0.5):
    print(tile_info)
{'type': 'Feature', 'id': '985b7c0c-5d4a-5105-a37b-ef41f4092392', 'geometry': {'type': 'MultiPolygon', 'coordinates': [[[[45.931783967, -15.374656929], [46.954538568, -15.368029755], [46.964123606, -16.360077552], [45.936356187, -16.367155102], [45.931783967, -15.374656929]]]]}, 'properties': {'collection': 'Sentinel2', 'license': {'licenseId': 'unlicensed', 'hasToBeSigned': 'never', 'grantedCountries': None, 'grantedOrganizationCountries': None, 'grantedFlags': None, 'viewService': 'public', 'signatureQuota': -1, 'description': {'shortName': 'No license'}}, 'productIdentifier': 'S2B_OPER_MSI_L1C_TL_MTI__20171215T085654_A004050_T38LPH_N02.06', 'parentIdentifier': None, 'title': 'S2B_OPER_MSI_L1C_TL_MTI__20171215T085654_A004050_T38LPH_N02.06', 'description': None, 'organisationName': None, 'startDate': '2017-12-15T07:12:03Z', 'completionDate': '2017-12-15T07:12:03Z', 'productType': 'S2MSI1C', 'processingLevel': '1C', 'platform': 'Sentinel-2', 'instrument': 'MSI', 'resolution': 10, 'sensorMode': None, 'orbitNumber': 4050, 'quicklook': None, 'thumbnail': None, 'updated': '2017-12-15T14:03:04.356331Z', 'published': '2017-12-15T14:03:04.356331Z', 'snowCover': 0, 'cloudCover': 28.27, 'keywords': [], 'centroid': {'type': 'Point', 'coordinates': [23.482061803, -15.8675924285]}, 's3Path': 'tiles/38/L/PH/2017/12/15/0', 'spacecraft': 'S2B', 'sgsId': 3440459, 's3URI': 's3://sentinel-s2-l1c/tiles/38/L/PH/2017/12/15/0/', 'services': {'download': {'url': 'http://sentinel-s2-l1c.s3-website.eu-central-1.amazonaws.com#tiles/38/L/PH/2017/12/15/0/', 'mimeType': 'text/html'}}, 'links': [{'rel': 'self', 'type': 'application/json', 'title': 'GeoJSON link for 985b7c0c-5d4a-5105-a37b-ef41f4092392', 'href': 'http://opensearch.sentinel-hub.com/resto/collections/Sentinel2/985b7c0c-5d4a-5105-a37b-ef41f4092392.json?&lang=en'}]}}

比如要获取瓦片信息的云量数据,则:

cld_cover = tile_info['properties']['cloudCover']

4.3 下载数据

4.3.1 下载AWS瓦片

  Sentinel-2的瓦片可以通过ESA瓦片ID(比如L1C_T01WCV_A012011_20171010T003615)或瓦片名称(例如T38TML或38TML)、观测时间和AWS索引来唯一地定义。AWS索引是AWS路径中的最后一个数字。该开发包采用第二种瓦片定义方式。按照如下方式将瓦片ID转换成
(tile_name, time, aws_index):

from sentinelhub import AwsTile

tile_id = 'S2A_OPER_MSI_L1C_TL_MTI__20151219T100121_A002563_T38TML_N02.01'
tile_name, time, aws_index = AwsTile.tile_id_to_tile(tile_id)
tile_name, time, aws_index

('38TML', '2015-12-19', 1)
根据转换后的瓦片名称、观测时间和AWS索引,我们就可以下载所需要的S-2数据了。比如,我们想要下载影像的B8A和B10波段,元数据文件:瓦片信息文件(tileInfo.json),预览文件(preview.jp2)和云掩膜文件(qi/MSK_CLOUDS_B00)。将这些文件保存至当前路径下的AwsData目录下。
```python
from sentinelhub import AwsTileRequest

bands = ['B8A', 'B10']
metafiles = ['tileInfo', 'preview', 'qi/MSK_CLOUDS_B00']
data_folder = './AwsData'

request = AwsTileRequest(tile=tile_name, time=time, aws_index=aws_index,
bands=bands, metafiles=metafiles, data_folder=data_folder,
data_source=DataSource.SENTINEL2_L1C)

request.save_data() # This is where the download is triggered

&emsp;&emsp;注意,bands 必须是波段列表中的子集(详见最后备注)。metafiles 必须是元文件列表中的子集 (详见最后备注)。另外,再次调用以上方法时,数据不会重新下载,除非设定参数```redownload=True```。
获取已经下载的数据,我们可以直接调用```get_data()```:
```python
data_list = request.get_data()  # This will not redownload anything because data is already stored on disk

b8a, b10, tile_info, preview, cloud_mask = data_list

  下载和读取也可以通过一次调用request.get_data(save_data=True)直接完成。

4.3.2 下载AWS产品

  通过ESA产品ID获取Sentinel-2 整个产品的数据。

from sentinelhub import AwsProductRequest

product_id = 'S2A_MSIL1C_20171010T003621_N0205_R002_T01WCV_20171010T003615'

request = AwsProductRequest(product_id=product_id, data_folder=data_folder)

# Uncomment the the following line to download the data:
# data_list = request.get_data(save_data=True)

  如果没有定义bands参数,将下载所有波段。如果没有定义metafiles参数,则不会下载其他元数据文件。

4.3.3 数据下载成.SAFE结构

  通过指定参数safe_format=True数据可以下载成.SAFE结构。

tile_request = AwsTileRequest(tile=tile_name, time=time, aws_index=aws_index,
                              bands=bands, metafiles=metafiles, data_folder=data_folder,
                              safe_format=True)

# Uncomment the the following line to download the data:
# tile_request.save_data()
product_id = 'S2A_OPER_PRD_MSIL1C_PDMC_20160121T043931_R069_V20160103T171947_20160103T171947'

product_request = AwsProductRequest(product_id=product_id, bands=['B01'],
                                    data_folder=data_folder, safe_format=True)

# Uncomment the the following line to download the data:
# product_request.save_data()

  以前的产品包含多个瓦片。如果只想下载一些瓦片,也可以指定要下载的瓦片列表。

product_request = AwsProductRequest(product_id=product_id, tile_list=['T14PNA', 'T13PHT'],
                                    data_folder=data_folder, safe_format=True)

# Uncomment the the following line to download the data:
# product_request.save_data()

备注:
L1C数据波段名称包括:

['B01', 'B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B8A', 'B09', 'B10', 'B11', 'B12']

元文件数据名称包括:

['productInfo', 'tileInfo', 'metadata', 'inspire', 'manifest', 'datastrip/*/metadata', 'preview', 'preview*', 'TCI', 'preview/B01', 'preview/B02', 'preview/B03', 'preview/B04', 'preview/B05', 'preview/B06', 'preview/B07', 'preview/B08', 'preview/B8A', 'preview/B09', 'preview/B10', 'preview/B11', 'preview/B12', 'qi/MSK_CLOUDS_B00', 'qi/MSK_DEFECT_B01', 'qi/MSK_DEFECT_B02', 'qi/MSK_DEFECT_B03', 'qi/MSK_DEFECT_B04', 'qi/MSK_DEFECT_B05', 'qi/MSK_DEFECT_B06', 'qi/MSK_DEFECT_B07', 'qi/MSK_DEFECT_B08', 'qi/MSK_DEFECT_B8A', 'qi/MSK_DEFECT_B09', 'qi/MSK_DEFECT_B10', 'qi/MSK_DEFECT_B11', 'qi/MSK_DEFECT_B12', 'qi/MSK_DETFOO_B01', 'qi/MSK_DETFOO_B02', 'qi/MSK_DETFOO_B03', 'qi/MSK_DETFOO_B04', 'qi/MSK_DETFOO_B05', 'qi/MSK_DETFOO_B06', 'qi/MSK_DETFOO_B07', 'qi/MSK_DETFOO_B08', 'qi/MSK_DETFOO_B8A', 'qi/MSK_DETFOO_B09', 'qi/MSK_DETFOO_B10', 'qi/MSK_DETFOO_B11', 'qi/MSK_DETFOO_B12', 'qi/MSK_NODATA_B01', 'qi/MSK_NODATA_B02', 'qi/MSK_NODATA_B03', 'qi/MSK_NODATA_B04', 'qi/MSK_NODATA_B05', 'qi/MSK_NODATA_B06', 'qi/MSK_NODATA_B07', 'qi/MSK_NODATA_B08', 'qi/MSK_NODATA_B8A', 'qi/MSK_NODATA_B09', 'qi/MSK_NODATA_B10', 'qi/MSK_NODATA_B11', 'qi/MSK_NODATA_B12', 'qi/MSK_SATURA_B01', 'qi/MSK_SATURA_B02', 'qi/MSK_SATURA_B03', 'qi/MSK_SATURA_B04', 'qi/MSK_SATURA_B05', 'qi/MSK_SATURA_B06', 'qi/MSK_SATURA_B07', 'qi/MSK_SATURA_B08', 'qi/MSK_SATURA_B8A', 'qi/MSK_SATURA_B09', 'qi/MSK_SATURA_B10', 'qi/MSK_SATURA_B11', 'qi/MSK_SATURA_B12', 'qi/MSK_TECQUA_B01', 'qi/MSK_TECQUA_B02', 'qi/MSK_TECQUA_B03', 'qi/MSK_TECQUA_B04', 'qi/MSK_TECQUA_B05', 'qi/MSK_TECQUA_B06', 'qi/MSK_TECQUA_B07', 'qi/MSK_TECQUA_B08', 'qi/MSK_TECQUA_B8A', 'qi/MSK_TECQUA_B09', 'qi/MSK_TECQUA_B10', 'qi/MSK_TECQUA_B11', 'qi/MSK_TECQUA_B12', 'qi/FORMAT_CORRECTNESS', 'qi/GENERAL_QUALITY', 'qi/GEOMETRIC_QUALITY', 'qi/SENSOR_QUALITY', 'auxiliary/ECMWFT']

L2A数据波段名称包括:

['R10m/B02', 'R10m/B03', 'R10m/B04', 'R10m/B08', 'R10m/AOT', 'R10m/TCI', 'R10m/WVP', 'R20m/B02', 'R20m/B03', 'R20m/B04', 'R20m/B05', 'R20m/B06', 'R20m/B07', 'R20m/B8A', 'R20m/B11', 'R20m/B12', 'R20m/AOT', 'R20m/SCL', 'R20m/TCI', 'R20m/VIS', 'R20m/WVP', 'R60m/B01', 'R60m/B02', 'R60m/B03', 'R60m/B04', 'R60m/B05', 'R60m/B06', 'R60m/B07', 'R60m/B8A', 'R60m/B09', 'R60m/B11', 'R60m/B12', 'R60m/AOT', 'R60m/SCL', 'R60m/TCI', 'R60m/WVP']

L2A元文件数据名称包括:

['productInfo', 'tileInfo', 'metadata', 'inspire', 'manifest', 'L2AManifest', 'report', 'datastrip/*/metadata', 'datastrip/*/qi/FORMAT_CORRECTNESS', 'datastrip/*/qi/GENERAL_QUALITY', 'datastrip/*/qi/GEOMETRIC_QUALITY', 'datastrip/*/qi/RADIOMETRIC_QUALITY', 'datastrip/*/qi/SENSOR_QUALITY', 'qi/L1C_PVI', 'qi/L2A_PVI', 'qi/SNW_20m', 'qi/SNW_60m', 'qi/CLD_20m', 'qi/CLD_60m', 'qi/MSK_DEFECT_B01', 'qi/MSK_DEFECT_B02', 'qi/MSK_DEFECT_B03', 'qi/MSK_DEFECT_B04', 'qi/MSK_DEFECT_B05', 'qi/MSK_DEFECT_B06', 'qi/MSK_DEFECT_B07', 'qi/MSK_DEFECT_B08', 'qi/MSK_DEFECT_B8A', 'qi/MSK_DEFECT_B09', 'qi/MSK_DEFECT_B10', 'qi/MSK_DEFECT_B11', 'qi/MSK_DEFECT_B12', 'qi/MSK_DETFOO_B01', 'qi/MSK_DETFOO_B02', 'qi/MSK_DETFOO_B03', 'qi/MSK_DETFOO_B04', 'qi/MSK_DETFOO_B05', 'qi/MSK_DETFOO_B06', 'qi/MSK_DETFOO_B07', 'qi/MSK_DETFOO_B08', 'qi/MSK_DETFOO_B8A', 'qi/MSK_DETFOO_B09', 'qi/MSK_DETFOO_B10', 'qi/MSK_DETFOO_B11', 'qi/MSK_DETFOO_B12', 'qi/MSK_NODATA_B01', 'qi/MSK_NODATA_B02', 'qi/MSK_NODATA_B03', 'qi/MSK_NODATA_B04', 'qi/MSK_NODATA_B05', 'qi/MSK_NODATA_B06', 'qi/MSK_NODATA_B07', 'qi/MSK_NODATA_B08', 'qi/MSK_NODATA_B8A', 'qi/MSK_NODATA_B09', 'qi/MSK_NODATA_B10', 'qi/MSK_NODATA_B11', 'qi/MSK_NODATA_B12', 'qi/MSK_SATURA_B01', 'qi/MSK_SATURA_B02', 'qi/MSK_SATURA_B03', 'qi/MSK_SATURA_B04', 'qi/MSK_SATURA_B05', 'qi/MSK_SATURA_B06', 'qi/MSK_SATURA_B07', 'qi/MSK_SATURA_B08', 'qi/MSK_SATURA_B8A', 'qi/MSK_SATURA_B09', 'qi/MSK_SATURA_B10', 'qi/MSK_SATURA_B11', 'qi/MSK_SATURA_B12', 'qi/MSK_TECQUA_B01', 'qi/MSK_TECQUA_B02', 'qi/MSK_TECQUA_B03', 'qi/MSK_TECQUA_B04', 'qi/MSK_TECQUA_B05', 'qi/MSK_TECQUA_B06', 'qi/MSK_TECQUA_B07', 'qi/MSK_TECQUA_B08', 'qi/MSK_TECQUA_B8A', 'qi/MSK_TECQUA_B09', 'qi/MSK_TECQUA_B10', 'qi/MSK_TECQUA_B11', 'qi/MSK_TECQUA_B12', 'qi/MSK_CLOUDS_B00', 'qi/FORMAT_CORRECTNESS', 'qi/GENERAL_QUALITY', 'qi/GEOMETRIC_QUALITY', 'qi/RADIOMETRIC_QUALITY', 'qi/SENSOR_QUALITY', 'auxiliary/ECMWFT', 'auxiliary/AUX_ECMWFT', 'auxiliary/GIP_TL']

相关链接:
1. sentinelhub 2.5.3 project description
2. sentinelhub configuration
3. sentinelhub-py on github

相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
130 10
|
15天前
|
存储 小程序 Python
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
### 农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 该程序通过`lunardate`库实现公历与农历的日期转换,支持闰月和跨年处理,用户输入农历节日名称后,可准确计算距离该节日还有多少天。功能包括农历节日查询、倒计时计算等。欢迎使用! (239字符)
158 86
|
7天前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
18天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
139 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
7天前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
15天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
1天前
|
程序员 Linux Python
python中模板和包的使用
本文介绍了 Python 模块和包的基本概念及使用方法。模块是 Python 程序结构的核心,每个以 `.py` 结尾的源文件都是一个模块,包含可重用的代码。文章详细讲解了模块的导入方式(如 `import` 和 `from...import`),模块的搜索顺序,以及如何创建和发布自己的模块。此外,还介绍了包的概念,包是包含多个模块的特殊目录,并通过 `__init__.py` 文件定义对外提供的模块列表。最后,文章简述了如何使用 `pip` 工具管理第三方模块的安装与卸载。作者:大石头的笔记;来源:稀土掘金。
|
1月前
|
存储 API 数据库
使用Python开发获取商品销量详情API接口
本文介绍了使用Python开发获取商品销量详情的API接口方法,涵盖API接口概述、技术选型(Flask与FastAPI)、环境准备、API接口创建及调用淘宝开放平台API等内容。通过示例代码,详细说明了如何构建和调用API,以及开发过程中需要注意的事项,如数据库连接、API权限、错误处理、安全性和性能优化等。
95 5
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。