python 操作boto3操作s3

2021-09-29 18:53:10 字數 3274 閱讀 4933

定時任務實時生成pdf,將檔案tornado用非同步io上傳到s3,有幾個坑記錄下:

import re

import boto3

import logging

from multiprocessing.dummy import pool as threadpool

aws_region_name = 'cn-north-1'

aws_s3_access_key_id = ""

aws_s3_secret_access_key = ""

aws_s3_wqs_bucket = ""

service_name="s3"

log_out_filename = "/var/log/fixs3_out.log"

log_error_filename = "/var/log/fixs3_err.log"

def setup_logger(logger_name, log_file, level=logging.info):

l = logging.getlogger(logger_name)

formatter = logging.formatter(fmt='%(asctime)s.%(msecs)03d [ %(name)s:%(process)d ] - [ %(levelname)s ] %(message)s',

datefmt='%y-%m-%d %h:%m:%s')

filehandler = logging.filehandler(log_file, mode='w')

filehandler.setformatter(formatter)

streamhandler = logging.streamhandler()

streamhandler.setformatter(formatter)

l.setlevel(level)

l.addhandler(filehandler)

l.addhandler(streamhandler)

setup_logger('log_out', log_out_filename)

out_logger = logging.getlogger('log_out')

class s3storyoperate(object):

def __init__(self):

try:

session = boto3.session.session(aws_access_key_id=aws_s3_access_key_id,

aws_secret_access_key=aws_s3_secret_access_key,

region_name=aws_region_name)

self.resource = session.resource('s3', aws_region_name)

except exception as ex:

print ex

exit(ex)

def get_all_key(self,bucket_name):

keys=

for obj in self.resource.bucket(bucket_name).objects.all():

return keys

def rename_all_key(self):

old_names=self.get_all_key(aws_s3_wqs_bucket)

pool = threadpool(4)

def func(old_name):

fix_result = self.fix_path(old_name)

if fix_result:

new_path = fix_result[1]

self.resource.object(aws_s3_wqs_bucket, new_path).copy_from(

copysource=aws_s3_wqs_bucket + "/" + old_name)

self.resource.object(aws_s3_wqs_bucket, old_name).delete()

try:

pool.map(func,old_names)

pool.close()

pool.join()

except exception as ex:

print ex

exit(ex)

def fix_path(self,old_path):

p=re.compile("/p(0|[1-9]\d?|[1-9]\d\d?|1000)-")

result=re.search(p,old_path)

if result:

page_num=result.group().replace("/p","").replace("-","")

else:

return

new_path=p.sub("/",old_path)

out=(old_path,new_path,page_num)

out_logger.info(out)

return out

def uploadfile(self,bucket,objkey,data):

try:

file_obj = self.resource.bucket(bucket).put_object(key=objkey, body=data)

except exception as ex:

print ex

exit(ex)

if __name__=="__main__":

s3=s3storyoperate()

s3.rename_all_key()

#s3.fix_path("szyz/unpaid/20170328/11/sx/220/214324456/d5e0fa9257b345faacd6959979265428/szyz20152055_96e3cbfd7dd74b6d88e0e968f5ca38b9.pdf")

1,boto3可能connect不上,文件沒有提示,一定要設定時區,不然會403,報access deny;

2, boto3沒有rename 介面文件,在stackoverflow上面看了下,最好也是最快的解決方案就是copy+deleded。

3,提供copy的介面有幾個,乙個是bucket提供介面,乙個是client提供介面,還有個是object提供的copy介面,因為是桶內的rename,使用object的copy&delete方案最快。

4,fixpath是自己的業務**,根據需求可以對應修改即可

python檔案操作3

4.python檔案的相關操作 模組 import os 操作 重新命名 os.rename old new 修改單級 目錄 檔案 名稱 os.renames old new 修改多級 目錄 檔案 名稱 可以修改檔案和資料夾 os.rename b.txt bb.txt os.rename firs...

Python3檔案操作 基本操作

目錄 1 獲取open函式及返回例項的幫助文件 2 open函式的定義及引數說明 2.1 open函式定義及返回值 2.2 引數說明 2.3 引數組合 2.4 示例 3 檔案物件常用方法 4 with open 語法 python3中對檔案的讀寫操作使用open函式來完成。print help op...

python3的檔案操作

python的檔案操作和php的檔案很類似 file物件使用 open 函式來建立,open的引數 r表示讀,w寫資料,在寫之前先清空檔案內容,a開啟並附加內容,開啟檔案之後記得關閉 下表列出了 file 物件常用的函式 序號方法及描述 file.close 關閉檔案。關閉後檔案不能再進行讀寫操作。...