Windows下载阿里云对象存储OSS文件(Python)

时间:2024-02-16 17:03:45

>> [目录] 数据远程采集 Step by Step

 

存储工具:阿里云->对象存储

WIN10,Python 3.7.4,PyCharm

需要将数据从云端下载到本地后再进行后续分析处理。

 

手动下载


需要下载的文件不多时,可以用这个方式。

依次点击:阿里云->控制台->对象存储->Bucket列表->XX Bucket->文件管理

该界面下,选中数据文件后,点击 批量操作->下载

image

 

脚本下载(Python)


按照阿里云的SDK文档(有各种语言的版本,这里选的是Python),可以很快地编写下载脚本:

https://help.aliyun.com/document_detail/32027.html?spm=a2c4g.11186623.2.24.5c741c62a5XKqp#concept-32027-zh

用到下载文件、列举文件、删除文件这3个功能。

 

下载文件

以下代码用于将指定的OSS文件下载到本地文件:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth(\'<yourAccessKeyId>\', \'<yourAccessKeySecret>\')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, \'http://oss-cn-hangzhou.aliyuncs.com\', \'<yourBucketName>\')
# <yourObjectName>从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
# <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
bucket.get_object_to_file(\'<yourObjectName>\', \'<yourLocalFile>\')

 

列举文件

以下代码用于列举指定存储空间下的10个文件:

# -*- coding: utf-8 -*-
import oss2
from itertools import islice

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth(\'<yourAccessKeyId>\', \'<yourAccessKeySecret>\')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, \'http://oss-cn-hangzhou.aliyuncs.com\', \'<yourBucketName>\')

# oss2.ObjectIteratorr用于遍历文件。
for b in islice(oss2.ObjectIterator(bucket), 10):
    print(b.key)

 

删除文件

以下代码用于删除指定文件:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth(\'<yourAccessKeyId>\', \'<yourAccessKeySecret>\')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, \'http://oss-cn-hangzhou.aliyuncs.com\', \'<yourBucketName>\')

# <yourObjectName>表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
bucket.delete_object(\'<yourObjectName>\')

 

根据上述代码,编写数据下载脚本如下(保存为 oss_download.py):

  1 import oss2
  2 import os
  3 from itertools import islice
  4 
  5 local_dir = \'E://data//\'
  6 access_key = \'<yourAccessKeyId>\'
  7 secret_key = \'<yourAccessKeySecret>\'
  8 
  9 try:
 10   # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。
 11   # 强烈建议您创建并使用RAM账号进行API访问或日常运维,
 12   # 请登录 https://ram.console.aliyun.com 创建RAM账号。
 13   auth = oss2.Auth(access_key, secret_key)
 14   # Endpoint以北京为例,其它Region请按实际情况填写。
 15   bucket = oss2.Bucket(auth, \'oss-cn-beijing.aliyuncs.com\', \'<yourBucketName>\')
 16 
 17   for obj in oss2.ObjectIterator(bucket):
 18     print(obj.key)
 19     filepath = local_dir + obj.key
 20     if os.path.exists(filepath):
 21       print (\'已存在:\' + filepath)
 22       # delete data
 23       print(\'删除云端数据:\' + obj.key)
 24       bucket.delete_object(obj.key)
 25     else:
 26       filedir = os.path.dirname(filepath)
 27       if not os.path.exists(filedir):
 28         os.makedirs(filedir)
 29         print(\'目录创建成功:\' + filedir)
 30       bucket.get_object_to_file(obj.key, filepath)
 31 except:
 32   print(\'wrong\')

 

程序中指定了本地的存储目录为’E://data//’,使用’//’来表示目录不容易出错。

列举出指定Bucket中的各个文件名,如果该文件在Bucket的一个二级目录下,文件名中也会包含文件夹信息,用print(obj.key) 打印出来:

FT_M003/FT_M003_00002019_2020-04-02_070821.db3

根据obj.key得到存储到本地的文件名 filepath = local_dir + obj.key

如果本地存在这个文件,就把云端Bucket中文件给删掉,否则就下载到本地(如果本地不存在目录,就创建目录)。当然也可以选择不删或者下载完成后马上就删,这个随意。

 

下载云端文件到本地(本地文件名:filepath)

bucket.get_object_to_file(obj.key, filepath)

 

删除云端文件

bucket.delete_object(obj.key)

 

<yourAccessKeyId>,<yourAccessKeySecret>

可以在AccessKey管理中创建,创建完成后会生成AccessKey和AccessKeySecret,并保存在一个csv文件中,通过这个钥匙可以获得阿里云所有API的访问权限,一定要好好保管。

image

<yourBucketName> 是之前创建的Bucket名称。

 

数据管理软件


在上述脚本的基础上,可以做一个数据管理软件,加入UI界面,还有这些功能:

同步:读取云端的所有文件名,更新到本地;

下载:下载全部文件、部分文件;

删除:删除全部文件、部分文件

这个软件做起来很灵活,实现起来应该也不难,这里不展开说了。