9
votes

Are there any API function that allow us to move files in Google Cloud Storage from one bucket in another bucket?

The scenario is we want Python to move read files in A bucket to B bucket. I knew that gsutil could do that but not sure Python can support that or not.

Thanks.

3
In Google Compute Engine you could even run the external gsutil command from Python application to move files.Paolo P.
Which Python API are you using?jterrace

3 Answers

4
votes

Using the google-api-python-client, there is an example on the storage.objects.copy page. After you copy, you can delete the source with storage.objects.delete.

destination_object_resource = {}
req = client.objects().copy(
        sourceBucket=bucket1,
        sourceObject=old_object,
        destinationBucket=bucket2,
        destinationObject=new_object,
        body=destination_object_resource)
resp = req.execute()
print json.dumps(resp, indent=2)

client.objects().delete(
        bucket=bucket1,
        object=old_object).execute()
13
votes

Here's a function I use when moving blobs between directories within the same bucket or to a different bucket.

from google.cloud import storage
import os

os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="path_to_your_creds.json"

def mv_blob(bucket_name, blob_name, new_bucket_name, new_blob_name):
"""
Function for moving files between directories or buckets. it will use GCP's copy 
function then delete the blob from the old location.

inputs
-----
bucket_name: name of bucket
blob_name: str, name of file 
    ex. 'data/some_location/file_name'
new_bucket_name: name of bucket (can be same as original if we're just moving around directories)
new_blob_name: str, name of file in new directory in target bucket 
    ex. 'data/destination/file_name'
"""
storage_client = storage.Client()
source_bucket = storage_client.get_bucket(bucket_name)
source_blob = source_bucket.blob(blob_name)
destination_bucket = storage_client.get_bucket(new_bucket_name)

# copy to new destination
new_blob = source_bucket.copy_blob(
    source_blob, destination_bucket, new_blob_name)
# delete in old destination
source_blob.delete()

print(f'File moved from {source_blob} to {new_blob_name}')
1
votes

you can use GCS Client Library Functions documented at [1] to read to one bucket and write to the other and then delete source file.

You can even use the GCS REST API documented at [2].

Link:
[1] - https://developers.google.com/appengine/docs/python/googlecloudstorageclient/functions
[2] - https://developers.google.com/storage/docs/concepts-techniques#overview