Загрузить CSV-файл в AWS S3 с помощью «upload_file» получить 0 байт в S3 - PullRequest
0 голосов
/ 27 октября 2019

Я хочу загрузить свой локальный CSV-файл в мое хранилище AWS S3

Я пытался:

s3 = boto3.resource('s3')

s3.meta.client.upload_file('verified_path_of_my_CSV', 'bucket_name', 'My_csv')

, но я получаю 0-байтовый CSV в моем ведре

Iтакже попробуйте:

s3_client = boto3.resource('s3')

bucket = s3.Bucket('bucket_name')
s3.Object(bucket, 'My_csv').put(Body=open(csv_path, 'rb'))

но я получаю эту ошибку:

Traceback (most recent call last):
  File "test-text.py", line 109, in <module>
    main()
  File "test-text.py", line 88, in main
    upload_csv(bucket, 'name_of_my_csv', 'My_path')
  File "test-text.py", line 56, in upload_csv
    s3.Object(bucket, 'My_csv').put(Body=open(csv_path, 'rb'))
 ...
  File "/home/toto/.local/lib/python3.7/site-packages/botocore/handlers.py", line 219, in validate_bucket_name
    if VALID_BUCKET.search(bucket) is None:
TypeError: expected string or bytes-like object

Как я могу сделать для загрузки моего CSV в S3?

Заранее спасибо


Решено:

На самом деле, когда я сделал свой CSV, я пишу это:

with open('job_file.csv', 'w') as csvfile:
    filewriter = csv.writer(csvfile, delimiter=',')
    text = process_text_analysis(bucket, file, True)
    filewriter.writerow(["doc1", text])
    upload_csv(bucket, key_s3, 'my_local_csv_path')

Но я исполняю upload_csv() до того, как закончил мой CSVправильный путь - переместить мою функцию загрузки из блока:

with open('job_file.csv', 'w') as csvfile:
    filewriter = csv.writer(csvfile, delimiter=',')
    text = process_text_analysis(bucket, file, True)
    filewriter.writerow(["doc1", text])

upload_csv(bucket, key_s3, 'my_local_csv_path')

глупая ошибка, которую я знаю :), но это добавление ...

Надеюсь, что это редактирование может избежать этого типавопрос в будущем;)

Спасибо всем вам за попытку решить мою проблему

1 Ответ

1 голос
/ 27 октября 2019

Это использует s3 в качестве клиента

 aws_session = boto3.Session()
 s3_client = aws_session.client('s3')
 local_path = os.path.join(root, file)
 bucket_name= "abc"
 s3_client.upload_file(localpath, bucket_name, s3_file)

in your case 

s3_client.upload_file('verified_path_of_my_CSV',bucket_name,"my_csv.csv")

Использование s3 в качестве ресурса

aws_session = aws_session.resource("s3")
s3_resource = self.aws_session.resource("s3")

def s3_upload(self, s3_bucket, s3_key, local_file_path):
        """
        To upload file to a S3 bucket
        :param s3_bucket: Bucket name
        :param s3_key: Key of the file in the S3 bucket
        :param local_file_path: Location of the file to upload
        :return:
        """
        fp = open(local_file_path, "rb")
        file_data = fp.read()
        mime_type, temp = self.mime.guess_type(local_file_path)
        s3_params = {
            "Key": s3_key
            , "Body": file_data
        }
        if mime_type is None:
            mime_type = "application/octet-stream"
        s3_params["ContentType"] = mime_type
        s3_resource.Bucket(s3_bucket).put_object(**s3_params)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...