如何使用七牛Python SDK写一个同步脚本及使用教程


Posted in Python onAugust 23, 2015

七牛云存储的 Python 语言版本 SDK(本文以下称 Python-SDK)是对七牛云存储API协议的一层封装,以提供一套对于 Python 开发者而言简单易用的开发工具。Python 开发者在对接 Python-SDK 时无需理解七牛云存储 API 协议的细节,原则上也不需要对 HTTP 协议和原理做非常深入的了解,但如果拥有基础的 HTTP 知识,对于出错场景的处理可以更加高效。

最近刚搭了个markdown静态博客,想把图片放到云存储中。

经过调研觉得七牛可以满足我个人的需求,就选它了。

要引用图片就要先将图片上传到云上。

虽然七牛网站后台可以上传文件,但每次上传都需要先登录,然后选择图片,设置连接地址,才能上传。

这个过程有些繁琐,所以我便想用七牛云提供的SDK写个一同步工具,方便增量同步文件。

有了这个想法,就马上行动。花了大概一个上午的时间,总算把这个工具给写出来,并放到GitOSC和github上。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# 
# AUTHOR = "heqingpan"
# AUTHOR_EMAIL = "heqingpan@126.com"
# URL = "http://git.oschina.net/hqp/qiniu_sync"
import qiniu
from qiniu import Auth
from qiniu import BucketManager
import os
import re
access_key = ''
secret_key = ''
bucket_name = ''
bucket_domain = ''
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
basedir=os.path.realpath(os.path.dirname(__file__))
filename=__file__
ignore_paths=[filename,"{0}c".format(filename)]
ignore_names=[".DS_Store",".git",".gitignore"]
charset="utf8"
diff_time=2*60

def list_all(bucket_name, bucket=None, prefix="", limit=100):
 rlist=[]
 if bucket is None:
  bucket = BucketManager(q)
 marker = None
 eof = False
 while eof is False:
  ret, eof, info = bucket.list(bucket_name, prefix=prefix, marker=marker, limit=limit)
  marker = ret.get('marker', None)
  for item in ret['items']:
   rlist.append(item["key"])
 if eof is not True:
  # 错误处理
  #print "error"
  pass
 return rlist
def get_files(basedir="",fix="",rlist=None,ignore_paths=[],ignore_names=[]):
 if rlist is None:
  rlist=[]
 for subfile in os.listdir(basedir):
  temp_path=os.path.join(basedir,subfile)
  tp=os.path.join(fix,subfile)
  if tp in ignore_names:
   continue
  if tp in ignore_paths:
   continue
  if os.path.isfile(temp_path):
   rlist.append(tp)
  elif os.path.isdir(temp_path):
   get_files(temp_path,tp,rlist,ignore_paths,ignore_names)
 return rlist
def get_valid_key_files(subdir=""):
 basedir=subdir or basedir
 files = get_files(basedir=basedir,ignore_paths=ignore_paths,ignore_names=ignore_names)
 return map(lambda f:(f.replace("\\","/"),f),files)

def sync():
 qn_keys=list_all(bucket_name,bucket)
 qn_set=set(qn_keys)
 l_key_files=get_valid_key_files(basedir)
 k2f={}
 update_keys=[]
 u_count=500
 u_index=0
 for k,f in l_key_files:
  k2f[k]=f
  str_k=k
  if isinstance(k,str):
   k=k.decode(charset)
  if k in qn_set:
   update_keys.append(str_k)
   u_index+=1
   if u_index > u_count:
    u_index-=u_count
    update_file(k2f,update_keys)
    update_keys=[]
  else:
   # upload
   upload_file(k,os.path.join(basedir,f))
 if update_keys:
  update_file(k2f,update_keys)
 print "sync end"
def update_file(k2f,ulist):
 ops=qiniu.build_batch_stat(bucket_name,ulist)
 rets,infos = bucket.batch(ops)
 for i in xrange(len(ulist)):
  k=ulist[i]
  f=k2f.get(k)
  ret=rets[i]["data"]
  size=ret.get("fsize",None)
  put_time = int(ret.get("putTime")/10000000)
  local_size=os.path.getsize(f)
  local_time=int(os.path.getatime(f))
  if local_size==size:
   continue
  if put_time >= local_time - diff_time:
   # is new
   continue
  # update
  upload_file(k,os.path.join(basedir,f))
def upload_file(key,localfile):
 print "upload_file:"
 print key
 token = q.upload_token(bucket_name, key)
 mime_type = get_mime_type(localfile)
 params = {'x:a': 'a'}
 progress_handler = lambda progress, total: progress
 ret, info = qiniu.put_file(token, key, localfile, params, mime_type, progress_handler=progress_handler)
def get_mime_type(path):
 mime_type = "text/plain"
 return mime_type
def main():
 sync()
if __name__=="__main__":
 main()

这个同步脚本支持批量比较文件,差异增量更新、批量更新。

使用方式

安装七牛Python SDK

pip install qiniu

填写脚本文件(qiniusync.py)的配置信息

access_key = ''
secret_key = ''
bucket_name = ''

注册后可以拿到对应的信息

将脚本文件(qiniusync.py)拷贝到待同步根目录

运行脚本

python qiniusync.py

后记

写完提交之后才发现,七牛已经提供相应的工具,我这个算是重复造轮子吧。

既然已经写,就发出来,当做熟悉一下七牛的SDK也不错,说不定以后还能用的上。

七牛云存储Python SDK使用教程

本教程旨在介绍如何使用七牛的Python SDK来快速地进行文件上传,下载,处理,管理等工作。

安装

首先,要使用Python的SDK必须要先安装。七牛的Python SDK是开源的,托管在Github上面,项目地址为 https://github.com/qiniu/python-sdk 。

安装的方式可以如项目的说明上所说,用 pip install qiniu 。当然也可以直接 clone 一份源代码下来直接使用。我一般喜欢直接 clone 源代码,这样的话,如果要对SDK做一些改动也是十分容易的。

最新版本的Python SDK需要依赖 requests 库,所以要提前安装好。安装方式当然也可以用 pip install requests 。

开发环境

Python的开发环境有很多种选择,如果喜欢文本的方式,比如vim,emacs,sublime text等都是很好的选择,如果你喜欢IDE,那么最流行的莫过于 PyCharm 了。 PyCharm 的最新版本到 这里下载。

Access Key和Secret Key

我们知道七牛云存储的权限校验机制基于一对密钥,分别称为 Access Key 和 Secret Key 。其中 Access Key 是公钥, Secret Key 是私钥。这一对密钥可以从七牛的后台获取。

如何使用七牛Python SDK写一个同步脚本及使用教程

小试牛刀

好了,做了上面的这些准备工作,我们就去上传一个简单的文件,练练手。

python
#coding=utf-8
__author__ = 'jemy'
'''

本例演示了一个简单的文件上传。

这个例子里面,sdk根据文件的大小选择是Form方式上传还是分片上传。

'''
import qiniu
accessKey = "<Your Access Key>"
secretKey = "<Your Secret Key>"
#解析结果
def parseRet(retData, respInfo):
 if retData != None:
 print("Upload file success!")
 print("Hash: " + retData["hash"])
 print("Key: " + retData["key"])
 #检查扩展参数
 for k, v in retData.items():
  if k[:2] == "x:":
  print(k + ":" + v)
 #检查其他参数
 for k, v in retData.items():
  if k[:2] == "x:" or k == "hash" or k == "key":
  continue
  else:
  print(k + ":" + str(v))
 else:
 print("Upload file failed!")
 print("Error: " + respInfo.text_body)
#无key上传,http请求中不指定key参数
def upload_without_key(bucket, filePath):
 #生成上传凭证
 auth = qiniu.Auth(accessKey, secretKey)
 upToken = auth.upload_token(bucket, key=None)
 #上传文件
 retData, respInfo = qiniu.put_file(upToken, None, filePath)
 #解析结果
 parseRet(retData, respInfo)
def main():
 bucket = "if-pbl"
 filePath = "/Users/jemy/Documents/jemy.png"
 upload_without_key(bucket, filePath)
if __name__ == "__main__":
 main()

运行结果为:

Upload file success!
Hash: Fp0XR6tM4yZmeiKXw7eZzmeyYsq8
Key: Fp0XR6tM4yZmeiKXw7eZzmeyYsq8

从上面我们可以看到,使用七牛的Python SDK上传文件的最基本的步骤是:

1.生成上传凭证

2.上传文件

3.解析回复结果

小结

综上所述,其实使用七牛的SDK来上传文件还是很简单的,接下来的教程,我们将在这个例子的基础上逐步了解更多关于文件上传的知识。

Python 相关文章推荐
详解Python程序与服务器连接的WSGI接口
Apr 29 Python
解决python 输出是省略号的问题
Apr 19 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
python使用rsa非对称加密过程解析
Dec 28 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
python 如何对logging日志封装
Dec 02 Python
python 自动刷新网页的两种方法
Apr 20 Python
Python中for循环和while循环的基本使用方法
Aug 21 #Python
Python中条件判断语句的简单使用方法
Aug 21 #Python
Python编程中的异常处理教程
Aug 21 #Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 #Python
约瑟夫问题的Python和C++求解方法
Aug 20 #Python
在类Unix系统上开始Python3编程入门
Aug 20 #Python
Python中字典映射类型的学习教程
Aug 20 #Python
You might like
dedecms系统常用术语汇总
2007/04/03 PHP
传智播客学习之java 反射
2009/11/22 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
使用python实现BLAST
2018/02/12 Python
Python读取properties配置文件操作示例
2018/03/29 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
详解Python3 基本数据类型
2019/04/19 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
python脚本和网页有何区别
2020/07/02 Python
Python 操作 MySQL数据库
2020/09/18 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
python如何实现递归转非递归
2021/02/25 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
安全生产工作汇报
2014/10/28 职场文书
铁路安全反思材料
2014/12/24 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers