开发者社区> 问答> 正文

Python-SDK之如何实现管理文件?

通过Python SDK,用户可以罗列、删除、拷贝文件,也可以查看文件信息,更改文件元信息等。

罗列文件


Python SDK提供了一系列的迭代器,用于列举文件、分片上传等。

简单罗列


列举Bucket里的10个文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. from itertools import islice
  4. auth = oss2.Auth('您的AccessKeyId', '您的AccessKeySecret')
  5. bucket = oss2.Bucket(auth, '您的Endpoint', '您的Bucket名')
  6. for b in islice(oss2.ObjectIterator(bucket), 10):
  7.     print(b.key)


按前缀罗列


只列举前缀为”img-“的所有文件:
  1. for obj in oss2.ObjectIterator(bucket, prefix='img-'):
  2.     print(obj.key)


模拟文件夹功能


OSS的存储空间(Bucket)本身是扁平结构的,并没有文件夹或目录的概念。用户可以通过在文件名里加入”/“来模拟文件夹。在列举的时候,则要设置delimiter参数(目录分隔符)为”/“,并通过是否为“公共前缀”来判断是否为文件夹。具体请参考 模拟文件夹功能
罗列“根目录”下的所有内容:
  1. for obj in oss2.ObjectIterator(bucket, delimiter='/'):
  2.     if obj.is_prefix():  # 文件夹
  3.         print('directory: ' + obj.key)
  4.     else:                # 文件
  5.         print('file: ' + obj.key)

注意: 模拟罗列文件夹这个操作比较低效,不建议使用。


判断文件是否存在


通过 object_exists 判断文件是否存在。返回值为 true 文件存在,为 false 文件不存在。
  1. exist = bucket.object_exists('remote.txt')
  2. if exist:
  3.     print('object exist')
  4. else:
  5.     print('object not eixst')


删除文件


删除单个文件:
  1. bucket.delete_object('remote.txt')

也可以删除多个文件(不能超过1000个)。下面的代码删除三个文件,同时打印成功删除的文件名:
  1. result = bucket.batch_delete_objects(['a.txt', 'b.txt', 'c.txt'])
  2. print('\n'.join(result.deleted_keys))


拷贝文件


把Bucket名为src-bucket下的source.txt拷贝到当前Bucket的target.txt文件。
  1. bucket.copy_object('src-bucket', 'source.txt', 'target.txt')


拷贝大文件


当文件比较大时,建议使用分片拷贝的方式进行拷贝,可以避免因文件太大而超时。分片拷贝和分片上传类似,分成三步:
  1. 初始化(Bucket.init_multipart_upload):得到Upload ID。
  2. 拷贝分片(Bucket.upload_part_copy):把源文件的一部分拷贝成目标文件的一个分片。
  3. 完成分片(Bucket.complete_multipart_copy):完成分片拷贝,生成目标文件。

请参考下面的示例:
  1. from oss2.models import PartInfo
  2. from oss2 import determine_part_size
  3. src_key = 'remote.txt'
  4. dst_key = 'remote-dst.txt'
  5. bucket.put_object(src_key, 'a' * (1024 * 1024  + 100))
  6. total_size = bucket.head_object(src_key).content_length
  7. part_size = determine_part_size(total_size, preferred_size=100 * 1024)
  8. # 初始化分片
  9. upload_id = bucket.init_multipart_upload(dst_key).upload_id
  10. parts = []
  11. # 逐个分片拷贝
  12. part_number = 1
  13. offset = 0
  14. while offset < total_size:
  15.     num_to_upload = min(part_size, total_size - offset)
  16.     byte_range = (offset, offset + num_to_upload - 1)
  17.     result = bucket.upload_part_copy(bucket.bucket_name, src_key, byte_range,
  18.                                      dst_key, upload_id, part_number)
  19.     parts.append(PartInfo(part_number, result.etag))
  20.     offset += num_to_upload
  21.     part_number += 1
  22. # 完成分片上传
  23. bucket.complete_multipart_upload(dst_key, upload_id, parts)


更改文件元信息


更改用户自定义元信息:
  1. bucket.update_object_meta('story.txt', {'x-oss-meta-author': 'O. Henry'})
  2. bucket.update_object_meta('story.txt', {'x-oss-meta-price': '100 dollar'})

对于用户自定义元信息(x-oss-meta-为前缀的HTTP头部),每次调用都会覆盖以前的值。就上面的例子来说,第二次调用实际上是删除了x-oss-meta-author这个自定义元信息。
也可以更改Content-Type等信息:
  1. bucket.update_object_meta('story.txt', {'Content-Type': 'text/plain'})

注意到这次调用不但修改了Content-Type,而且把原先设置的用户自定义元信息也给清除了。

查看文件访问权限

  1. print(bucket.get_object_acl('story.txt').acl)

说明: 文件的访问权限有四种:default(默认)、private(私有读写)、public-read(公共读私有写)、public-read-write(公共读写),更详细的说明请参看 Object级别权限


设置文件访问权限


把文件的访问权限设为公共读私有写:
  1. bucket.put_object_acl('story.txt', oss2.OBJECT_ACL_PUBLIC_READ)

说明: 文件的访问权限有四种:default(默认)、private(私有读写)、public-read(公共读私有写)、public-read-write(公共读写),分别对应oss2.OBJECT_ACL_DEFAULT、oss2.OBJECT_ACL_PRIVATE、oss2.OBJECT_ACL_PUBLIC_READ、oss2.OBJECT_ACL_PUBLIC_READ_WRITE 。

展开
收起
青衫无名 2017-10-18 11:33:43 2980 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
一个跨平台的云服务SDK需要什么 立即下载
Data Pre-Processing in Python: 立即下载