1
1
import boto3
2
+ import botocore
2
3
import re
3
4
import os
4
5
import time
@@ -45,13 +46,14 @@ def __init__(self, url, path=""):
45
46
self .bucket_name = s3_dest ["bucket" ]
46
47
self .path = s3_dest ["path" ]
47
48
48
- self ._s3 = None
49
+ self ._s3resource = None
50
+ self ._s3client = None
49
51
self ._bucket = None
50
52
print ("self.endpoint_url" , self .endpoint_url )
51
53
52
- def s3 (self ):
53
- if self ._s3 :
54
- return self ._s3
54
+ def s3resource (self ):
55
+ if self ._s3resource :
56
+ return self ._s3resource
55
57
56
58
self ._s3 = boto3 .resource (
57
59
"s3" ,
@@ -60,11 +62,22 @@ def s3(self):
60
62
)
61
63
return self ._s3
62
64
65
+ def s3client (self ):
66
+ if self ._s3client :
67
+ return self ._s3client
68
+
69
+ self ._s3client = boto3 .client (
70
+ "s3" ,
71
+ endpoint_url = self .endpoint_url ,
72
+ config = Config (signature_version = "s3v4" ),
73
+ )
74
+ return self ._s3client
75
+
63
76
def bucket (self ):
64
77
if self ._bucket :
65
78
return self ._bucket
66
79
67
- self ._bucket = self .s3 ().Bucket (self .bucket_name )
80
+ self ._bucket = self .s3resource ().Bucket (self .bucket_name )
68
81
return self ._bucket
69
82
70
83
def upload_file (self , source , dest ):
@@ -88,7 +101,7 @@ def download_file(self, dest):
88
101
if not dest :
89
102
dest = self .path .split ("/" ).pop ()
90
103
print (f"Downloading { self .url } to { dest } ..." )
91
- object = self .s3 ().Object (self .bucket_name , self .path )
104
+ object = self .s3resource ().Object (self .bucket_name , self .path )
92
105
object .load ()
93
106
94
107
with tqdm (
@@ -98,3 +111,18 @@ def download_file(self, dest):
98
111
Filename = dest ,
99
112
Callback = lambda bytes_transffered : bar .update (bytes_transffered ),
100
113
)
114
+
115
+ def file_exists (self ):
116
+ # res = self.s3client().list_objects_v2(
117
+ # Bucket=self.bucket_name, Prefix=self.path, MaxKeys=1
118
+ # )
119
+ # return "Contents" in res
120
+ object = self .s3resource ().Object (self .bucket_name , self .path )
121
+ try :
122
+ object .load ()
123
+ except botocore .exceptions .ClientError as error :
124
+ if error .response ["Error" ]["Code" ] == "404" :
125
+ return False
126
+ else :
127
+ raise
128
+ return True
0 commit comments