设为首页 收藏本站
查看: 614|回复: 0

[经验分享] 基于七牛Python SDK写的一个同步脚本

[复制链接]

尚未签到

发表于 2015-11-30 08:02:14 | 显示全部楼层 |阅读模式
#!/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
  f=k2f.get(k)
  ret=rets["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()
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145093-1-1.html 上篇帖子: python 小爬虫的各种总结(二) 下篇帖子: ODPS_ele—UDF Python API
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表