Muszę napisać kod w Pythonie, który usunie wymagany plik z zasobnika Amazon s3. Jestem w stanie połączyć się z zasobnikiem Amazon s3, a także zapisywać pliki, ale jak mogę usunąć plik?
@AkashTantri Osobiście nie próbowałem, ale dokument mówi, że usuwa wersję zerową (jeśli istnieje) [...] Jeśli nie ma wersji zerowej, Amazon S3 nie usuwa żadnych obiektów. Więc przypuszczam, że nie spowoduje to błędu. Jeśli zdarzy ci się spróbować (po prostu zrób coś takiego s3.Object('existing-bucket', 'bogus-key').delete()i zobacz, co się stanie. Spróbuj także s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi Róbert
Działa jak urok, to prawdziwa moc pytona
yunus
@yunus czy to poważny komentarz?
Henry Henrinson
Czy your-keytutaj oznacza rzeczywistą nazwę pliku w your-bucketS3?
Underoos
91
znalazłem jeszcze jeden sposób na zrobienie tego za pomocą boto:
from boto.s3.connection import S3Connection, Bucket, Key
conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)
b = Bucket(conn, S3_BUCKET_NAME)
k = Key(b)
k.key = 'images/my-images/'+filename
b.delete_key(k)
Jeśli chcesz usunąć WSZYSTKO w wiadrze, możesz zrobić:for x in b.list(): b.delete_key(x.key)
jontsai
19
Uwielbiam sposób w moim pliku okazuje się byćbucket.list()
Artur Sapek
Aby ten fragment kodu działał jak przedstawiono, musisz zaimportować, Bucketa Keytakże. Jak w:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas
Otrzymuję, >>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connectionproszę, zaktualizuj odpowiedź na boto3
@Rob Dokumentacja boto3 jest myląca. utworzy znacznik usuwania, jeśli obiekt jest wersjonowany. W przeciwnym razie usunie obiekt.
jarmod
1
Czyste i proste. Może to być akceptowana odpowiedź i zdecydowanie powinna zostać połączona z odpowiedzią @ Kohányi Róbert, ponieważ oba są najlepszym podejściem do zadania.
tak, używam tej biblioteki Pythona, ale czy to usunie plik? czy powinienem to zrobić w ten sposób: k.key = 'images / anon-images / small /' + filename k.delete_key () czy to poprawne? proszę daj mi znać.
Suhail
@Suhail: Nie korzystałem z tej biblioteki, ale ze źródła, które podłączyłem, tak naprawdę robi to DELETEpołączenie przez interfejs REST. Więc tak, pomimo nazwy „delete_key” (co, zgadzam się, jest niejasne), tak naprawdę usuwa obiekt, do którego odwołuje się klucz.
TJ Crowder
1
A co z usunięciem wielu plików ze wspólnym prefiksem w nazwie? Czy S3 pozwala na zbiorcze usuwanie w takim przypadku, czy też usuwanie ich jeden po drugim (co jest powolne) jest koniecznością?
Illarion Kovalchuk,
@Shaman: Nie jestem ekspertem od S3, ale o ile wiem , możesz usunąć tylko określony plik. Ale prawdopodobnie chcesz zadać to pytanie jako pytanie, aby zwrócić na to uwagę ekspertów S3.
TJ Crowder,
Zaraz po skomentowaniu tutaj dodałem takie pytanie. Ma jeszcze 2 widoki :)
Wywołanie podpowłoki w celu komunikacji z S3 nie jest dokładnie pythonowe (biblioteka lub bezpośrednia transakcja HTTP byłaby bardziej elegancka), ale nadal działa. Myślę, że nie zasługuje na złą opinię. +1.
jeśli próbujesz usunąć plik przy użyciu własnej lokalnej konsoli hosta, możesz spróbować uruchomić ten skrypt Pythona zakładając, że już przypisałeś swój identyfikator dostępu i tajny klucz w systemie
import boto3
#my custom sesssion
aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host")
client=aws_m.client('s3')
#list bucket objects before deleting
response = client.list_objects(
Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
print(x.get("Key",None));
#delete bucket objects
response = client.delete_object(
Bucket='your-bucket-name',
Key='mydocs.txt'
)
#list bucket objects after deleting
response = client.list_objects(
Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
print(x.get("Key",None));
Odpowiedzi:
Korzystanie
boto3
(obecnie wersja 1.4.4) useS3.Object.delete()
.import boto3 s3 = boto3.resource('s3') s3.Object('your-bucket', 'your-key').delete()
źródło
s3.Object('existing-bucket', 'bogus-key').delete()
i zobacz, co się stanie. Spróbuj takżes3.Object('bogus-bucket', 'bogus-key').delete()
.your-key
tutaj oznacza rzeczywistą nazwę pliku wyour-bucket
S3?znalazłem jeszcze jeden sposób na zrobienie tego za pomocą boto:
from boto.s3.connection import S3Connection, Bucket, Key conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY) b = Bucket(conn, S3_BUCKET_NAME) k = Key(b) k.key = 'images/my-images/'+filename b.delete_key(k)
źródło
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
aKey
także. Jak w:from boto.s3.connection import S3Connection, Bucket, Key
>>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connection
proszę, zaktualizuj odpowiedź na boto3Używając Python boto3 SDK (i zakładając, że poświadczenia są skonfigurowane dla AWS), poniższe czynności usuwają określony obiekt w zasobniku:
import boto3 client = boto3.client('s3') client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
źródło
Witamy w 2020, oto odpowiedź w Pythonie / Django:
from django.conf import settings import boto3 s3 = boto3.client('s3') s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")
Znalezienie odpowiedzi zajęło mi zbyt dużo czasu i było to takie proste.
źródło
Dziwię się, że nie ma takiej prostej drogi
key.delete()
:from boto.s3.connection import S3Connection, Bucket, Key conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY) bucket = Bucket(conn, S3_BUCKET_NAME) k = Key(bucket = bucket, name=path_to_file) k.delete()
źródło
Spróbuj poszukać zaktualizowanej metody , ponieważ Boto3 może się od czasu do czasu zmieniać. Użyłem my_bucket.delete_objects () :
import boto3 from boto3.session import Session session = Session(aws_access_key_id='your_key_id', aws_secret_access_key='your_secret_key') # s3_client = session.client('s3') s3_resource = session.resource('s3') my_bucket = s3_resource.Bucket("your_bucket_name") response = my_bucket.delete_objects( Delete={ 'Objects': [ { 'Key': "your_file_name_key" # the_name of_your_file } ] } )
źródło
Przez który interfejs? Korzystając z interfejsu REST, po prostu wysyłasz usunięcie :
DELETE /ObjectName HTTP/1.1 Host: BucketName.s3.amazonaws.com Date: date Content-Length: length Authorization: signatureValue
Poprzez interfejs SOAP :
<DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <Bucket>quotes</Bucket> <Key>Nelson</Key> <AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId> <Timestamp>2006-03-01T12:00:00.183Z</Timestamp> <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature> </DeleteObject>
Jeśli używasz biblioteki Pythona, takiej jak boto , powinna ona udostępniać funkcję „usuń”, na przykład
delete_key()
.źródło
DELETE
połączenie przez interfejs REST. Więc tak, pomimo nazwy „delete_key” (co, zgadzam się, jest niejasne), tak naprawdę usuwa obiekt, do którego odwołuje się klucz.Najprostszym sposobem na to jest:
import boto3 s3 = boto3.resource("s3") bucket_source = { 'Bucket': "my-bcuket", 'Key': "file_path_in_bucket" } s3.meta.client.delete(bucket_source)
źródło
Na razie rozwiązałem ten problem za pomocą narzędzia Linux s3cmd . Użyłem tego w Pythonie w ten sposób:
delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename os.system(delFile)
źródło
Pomogło mi, spróbuj.
import boto import sys from boto.s3.key import Key import boto.s3.connection AWS_ACCESS_KEY_ID = '<access_key>' AWS_SECRET_ACCESS_KEY = '<secret_access_key>' Bucketname = 'bucket_name' conn = boto.s3.connect_to_region('us-east-2', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, is_secure=True, calling_format = boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.get_bucket(Bucketname) k = Key(bucket) k.key = 'filename to delete' bucket.delete_key(k)
źródło
możesz to zrobić używając aws cli: https://aws.amazon.com/cli/ i jakiegoś polecenia unixowego.
te polecenia aws cli powinny działać:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
jeśli chcesz uwzględnić podfoldery, powinieneś dodać flagę --recursive
lub za pomocą poleceń unix:
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I% <your_os_shell> -c 'aws s3 rm s3:// <your_bucket_name> /% $1'
wyjaśnienie:
źródło
jeśli próbujesz usunąć plik przy użyciu własnej lokalnej konsoli hosta, możesz spróbować uruchomić ten skrypt Pythona zakładając, że już przypisałeś swój identyfikator dostępu i tajny klucz w systemie
import boto3 #my custom sesssion aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host") client=aws_m.client('s3') #list bucket objects before deleting response = client.list_objects( Bucket='your-bucket-name' ) for x in response.get("Contents", None): print(x.get("Key",None)); #delete bucket objects response = client.delete_object( Bucket='your-bucket-name', Key='mydocs.txt' ) #list bucket objects after deleting response = client.list_objects( Bucket='your-bucket-name' ) for x in response.get("Contents", None): print(x.get("Key",None));
źródło
Poniższe zadziałały dla mnie (w oparciu o przykład dla modelu Django, ale prawie sam możesz użyć kodu
delete
metody).import boto3 from boto3.session import Session from django.conf import settings class Video(models.Model): title=models.CharField(max_length=500) description=models.TextField(default="") creation_date=models.DateTimeField(default=timezone.now) videofile=models.FileField(upload_to='videos/', null=True, verbose_name="") tags = TaggableManager() actions = ['delete'] def __str__(self): return self.title + ": " + str(self.videofile) def delete(self, *args, **kwargs): session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY) s3_resource = session.resource('s3') s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME) file_path = "media/" + str(self.videofile) response = s3_bucket.delete_objects( Delete={ 'Objects': [ { 'Key': file_path } ] }) super(Video, self).delete(*args, **kwargs)
źródło
Poniżej znajduje się fragment kodu, którego możesz użyć do usunięcia zasobnika,
import boto3, botocore from botocore.exceptions import ClientError s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key') s3.Object('Bucket-Name', 'file-name as key').delete()
źródło
spróbuj tego kodu
import boto3 s3 = boto3.client('s3') s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
źródło