Перенос файла из хранилища GCP в другое хранилище без sdk

#python #python-3.x #google-cloud-platform #google-cloud-storage

#python #python-3.x #google-облачная платформа #google-облачное хранилище

Вопрос:

у меня есть файлы в облачном хранилище gcp в иерархии

 data/staging1 
  --/temp1.json
  --/temp2.json
  --/temp3.json
data/staging2 
  --/temp1.json
  --/temp2.json
  --/temp3.json
 

хотите прочитать весь файл в staging1 и переместить в другую папку staging2

  def getFiles(self):
        filename = list(self.bucketname.list_blobs(prefix=self.prefix))

        target_blob = filename[0]
        print(target_blob)
        filename = list(self.bucketname.list_blobs(prefix=self.prefix))
        for name in filename:
            local_tmp_path =name.name
            local_tmp_path=self.bucketname.blob(local_tmp_path)
            with open(local_tmp_path, 'r') as f:
                    target_blob.upload_from_file(f)
                    print("done")
 

я хочу прочитать весь файл в цикле….когда я пытаюсь открыть его, отображается ошибка

     with open(local_tmp_path, 'r') as f:
TypeError: expected str, bytes or os.PathLike object, not Blob

 for name in filename:
            local_tmp_path =name.name
            local_tmp_path=self.bucketname.blob(local_tmp_path)
            with open(local_tmp_path, 'r') as f:
                    target_blob.upload_from_file(f)
 

Комментарии:

1. Вы хотите переместить файл из хранилища в другое место? Вам нужно прочитать файл в вашем коде или вы сделали это только для копии?

Ответ №1:

В соответствии с этой официальной документацией GCP вы можете переместить / перенести файл из одного хранилища в другое хранилище программно. Даже если хранилище находится в другом проекте, процесс тот же.

 
"""Command-line sample that creates a daily transfer from a standard
GCS bucket to a Nearline GCS bucket for objects untouched for 30 days.

This sample is used on this page:

    https://cloud.google.com/storage/transfer/create-transfer

For more information, see README.md.
"""

import argparse
import datetime
import json

import googleapiclient.discovery


def main(description, project_id, start_date, start_time, source_bucket,
         sink_bucket):
    """Create a daily transfer from Standard to Nearline Storage class."""
    storagetransfer = googleapiclient.discovery.build('storagetransfer', 'v1')

    # Edit this template with desired parameters.
    transfer_job = {
        'description': description,
        'status': 'ENABLED',
        'projectId': project_id,
        'schedule': {
            'scheduleStartDate': {
                'day': start_date.day,
                'month': start_date.month,
                'year': start_date.year
            },
            'startTimeOfDay': {
                'hours': start_time.hour,
                'minutes': start_time.minute,
                'seconds': start_time.second
            }
        },
        'transferSpec': {
            'gcsDataSource': {
                'bucketName': source_bucket
            },
            'gcsDataSink': {
                'bucketName': sink_bucket
            },
            'objectConditions': {
                'minTimeElapsedSinceLastModification': '2592000s'  # 30 days
            },
            'transferOptions': {
                'deleteObjectsFromSourceAfterTransfer': 'true'
            }
        }
    }

    result = storagetransfer.transferJobs().create(body=transfer_job).execute()
    print('Returned transferJob: {}'.format(
        json.dumps(result, indent=4)))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('description', help='Transfer description.')
    parser.add_argument('project_id', help='Your Google Cloud project ID.')
    parser.add_argument('start_date', help='Date YYYY/MM/DD.')
    parser.add_argument('start_time', help='UTC Time (24hr) HH:MM:SS.')
    parser.add_argument('source_bucket', help='Standard GCS bucket name.')
    parser.add_argument('sink_bucket', help='Nearline GCS bucket name.')

    args = parser.parse_args()
    start_date = datetime.datetime.strptime(args.start_date, '%Y/%m/%d')
    start_time = datetime.datetime.strptime(args.start_time, '%H:%M:%S')

    main(
        args.description,
        args.project_id,
        start_date,
        start_time,
        args.source_bucket,
        args.sink_bucket)