Невозможно загрузить несколько файлов в AWS S3, используя Python Script и подстановочные знаки - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в работе с python, а также с AWS.

Я пытаюсь переместить различные файлы «и обычно» с определенными форматами с моего локального компьютера в папку S3 AWS с помощью скрипта Python. У меня возникла проблема с использованием подстановочного знака в скрипте для одновременной ловли различных файлов. Я могу переместить один файл за раз, используя строку «data = open ('file_example_here.csv', 'rb')», хотя я застрял в настройке своего скрипта на python для захвата всех (то есть .csv или всех .json)файлы). Пример набора файлов подробно описан ниже, поэтому, если я хочу переместить все файлы .json в мой экземпляр s3, используя подстановочный знак в сценарии, как я могу настроить скрипт для обработки этого запроса, если это возможно ?.

Любая помощь будет принята с благодарностью, реализация приведена ниже.


/home/user/folder1/c_log_1-10-19.csv
/home/user/folder1/c_log_2-10-19.csv
/home/user/folder1/c_log_3-10-19.csv
/home/user/folder1/c_log_4-10-19.csv
/home/user/folder1/c_log_5-10-19.csv
/home/user/folder1/c_log_6-10-19.csv

/home/user/folder1/h_log_1-11-18.json
/home/user/folder1/h_log_2-11-18.json
/home/user/folder1/h_log_3-11-18.json
/home/user/folder1/h_log_4-11-18.json
/home/user/folder1/h_log_5-11-18.json
/home/user/folder1/h_log_6-11-18.json

import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'key_id_here'
ACCESS_SECRET_KEY = 'secret_key_here'
BUCKET_NAME = 'bucket_name_here'

data = open('test_file.csv', 'rb')

s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)
s3.Bucket(BUCKET_NAME).put_object(Key='folder_test/folder_test_2/test_file.csv', Body=data)

print ("All_Done")


````````````````````````````````````````````````````
################################################
############## UPDATED CODE BELOW ############
################################################
import glob
import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'some_key'
ACCESS_SECRET_KEY = 'some_key'
BUCKET_NAME = 'some_bucket'

#session = boto3.Session(profile_name='default')
s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)

csv_files = glob.glob("/home/user/Desktop/*.csv")
#json_files = glob.glob("/home/user/folder1/h_log_*.json")

for filename in csv_files:
    print("Putting %s" % filename)
    s3.upload_file(filename, BUCKET_NAME, filename)

#for filename in json_files:
#    print("Putting %s" % filename)
#    s3.upload_file(filename, BUCKET_NAME, filename)

s3.Bucket(BUCKET_NAME).put_object(Key='folder1/folder1', Body=csv_files)

print("All_Done")

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Вы можете использовать что-то простое, например, модуль glob в Python, чтобы найти все файлы, соответствующие указанному шаблону, как показано в следующем примере:

#!/usr/bin/env python

import glob
import boto3
import os

BUCKET_NAME = 'MyBucket'
FOLDER_NAME = 'folder1/folder1'

session = boto3.Session(profile_name='default')
s3 = session.client('s3')

csv_files = glob.glob("/home/user/folder1/c_log_*.csv")
json_files = glob.glob("/home/user/folder1/h_log_*.json")

for filename in csv_files:
    key = "%s/%s" % (FOLDER_NAME, os.path.basename(filename))
    print("Putting %s as %s" % (filename,key))
    s3.upload_file(filename, BUCKET_NAME, key)

for filename in json_files:
    key = "%s/%s" % (FOLDER_NAME, os.path.basename(filename))
    print("Putting %s as %s" % (filename,key))
    s3.upload_file(filename, BUCKET_NAME, key)

print("All_Done")

В приведенном выше коде предполагается, что у вас AWS CLIустанавливается с ключом доступа, настроенным под профилем по умолчанию. Если нет, вы можете использовать различные методы аутентификации с помощью boto3 .

Вероятно, есть более питонский способ сделать это, но этот простой скрипт работает.

0 голосов
/ 03 октября 2019

Проверьте модуль glob (https://docs.python.org/3/library/glob.html).

import glob
csv_files = glob.glob('/home/user/folder_1/*.csv')
json_files = glob.glob('/home/user/folder_1/*.json')

Затем выполните итерации по этим спискам и загрузите, как вы делали.

Кроме того, нет необходимости читать данные изфайл. Просто используйте метод upload_file в корзине: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Bucket.upload_file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...