Используйте boto3 для загрузки файла на S3 - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть скрипт для загрузки файла CSV, который находится в контейнере, в корзину S3, я скопировал файл на локальный компьютер и тестирую скрипт локально, но получаю ошибки. Я все еще изучаю, пытаюсь узнать, какая часть мне не хватает в скрипте и как я могу запустить это и загрузить файл на S3,

Вот ошибки:

error_1 :

Traceback (most recent call last):
  File "C:/Users/U12345/IdeaProjects/xxx/s3_upload.py", line 19, in <module>
    r'C:\Users\U12345\IdeaProjects\xxx\test_' + str(current_date) + '.csv')
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\\Users\\U12345\\IdeaProjects\\xxx\\test.csv' -> 'C:\\Users\\U12345\\IdeaProjects\\xxx\\test_2020-04-16 10:55:41.csv'

error_02:

File "C:/Users/U12345/IdeaProjects/xxx/s3_upload.py", line 33
    response = s3_client.put_object(Body='C:\Users\U6079325/IdeaProjects/xxx/test.csv',
                                        ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

Другая проблема заключается в том, что я не очень уверен, как вызывать эту функцию, какой параметр поместить в скобку, он дал мне разные ошибки.

Я борюсь с этим уже почти неделю, немного расстроенный, может ли кто-нибудь дать мне некоторую помощь или хороший пример, которому я могу следовать.

Обновление:

error02 и последняя проблема была решена, просто первая ошибка все еще не работает, я пробовал '/', '\', с 'C:', без 'C:', все не работает ...

Ответы [ 3 ]

3 голосов
/ 16 апреля 2020

У вас есть несколько вещей для решения, поэтому давайте разберем их немного.

1) Когда вы вызываете upload_to_s3(), вам нужно вызывать его с параметрами функции, которые вы объявили с, имя файла и ключ ведра. Так, например, upload_to_s3(filename, bucket_key).

2) Прошло много времени с тех пор, как я использовал Windows & Python, но спросите себя, использует ли он \ вместо / в путях к файлам Также убедитесь, что файл определенно находится в ожидаемом вами месте.

3) Для загрузки S3 Body: - это фактические данные, которые вы хотите загрузить, а не имя файла данных. Вы вызвали его внутри open(...) as file, поэтому теперь у вас есть объект с именем file, который представляет его.

3 голосов
/ 16 апреля 2020

Полагаю, вы используете put_object () неправильно. Он используется для сохранения 'объекта' на s3 & , а не в файле , т. Е. Сначала необходимо прочитать содержимое файла, используя pandas .read_csv () или что-то еще, а затем заменить часть 'Body' с объектом, полученным при чтении. Что-то вроде этого

  df= pandas.read_csv('C:\Users\U6079325/IdeaProjects/xxx/test.csv')
  response = s3_client.put_object(Body=df,  
                                    Bucket=output_bucket,
                                    Key='test.csv',
                                    ACL="bucket-owner-full-control")

Если вы хотите sh загрузить файл напрямую, вы должны использовать

  s3 = boto3.resource('s3')
  s3.meta.client.upload_file('C:\Users\U6079325/IdeaProjects/xxx/test.csv', output_bucket, 'test.csv')
0 голосов
/ 16 апреля 2020

в последней строке

upload_to_s3()

вы фактически не задали функции никаких параметров. в скобках указываются следующие параметры:

(source_filename: str, key: str)

ie дают функции имя файла и корзину

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