скачать файл с помощью s3fs
Я пытаюсь загрузить файл csv из ведра s3 с помощью библиотеки s3fs. Я заметил, что написание нового csv с использованием pandas каким-то образом изменило данные. Поэтому я хочу загрузить файл прямо в необработанном виде.
В документации есть функция загрузки, но я не понимаю, как ею пользоваться:
download(self, rpath, lpath[, recursive])
: Alias of FilesystemSpec.get.
Вот что я пробовал:
import pandas as pd
import datetime
import os
import s3fs
import numpy as np
#Creds for s3
fs = s3fs.S3FileSystem(key=mykey, secret=mysecretkey)
bucket = "s3://mys3bucket/mys3bucket"
files = fs.ls(bucket)[-3:]
#download files:
for file in files:
with fs.open(file) as f:
fs.download(f,"test.csv")
AttributeError: 'S3File' object has no attribute 'rstrip'
2 ответа
Я собираюсь скопировать здесь и свой ответ, поскольку использовал его в более общем случае:
# Access Pando
import s3fs
#Blocked out url as "enter url here" for security reasons
fs = s3fs.S3FileSystem(anon=True, client_kwargs={'endpoint_url':"enter url here"})
# List objects in a path and import to array
# -3 limits output for testing purposes to prevent memory overload
files = fs.ls('hrrr/sfc/20190101')[-3:]
#Make a staging directory that can hold data as a medium
os.mkdir("Staging")
#Copy files into that directory (specific directory structure requires splitting strings)
for file in files:
item = str(file)
lst = item.split("/")
name = lst[3]
path = "Staging\\" + name
print(path)
fs.download(file, path)
Обратите внимание, что документация для этого конкретного пакета python довольно бесполезна. Мне удалось найти документацию о том, какие аргументы принимает s3fs здесь (https://readthedocs.org/projects/s3fs/downloads/pdf/latest/). Полный список аргументов находится ближе к концу, хотя они не указывают, что означают параметры. Вот общее руководство для s3fs.download:
-arg1 (rpath) - это исходный каталог, откуда вы получаете файлы. Как и в обоих приведенных выше ответах, лучший способ получить это - выполнить fs.ls в вашем ведре s3 и сохранить его в переменной
-arg2 (lpath) - это целевой каталог и имя файла. Обратите внимание, что без допустимого выходного файла будет возвращена ошибка атрибута OP. Я определил это как переменную пути
-arg3 - необязательный параметр для выбора рекурсивной загрузки.
for file in files:
fs.download(file,'test.csv')
Изменено для загрузки всех файлов в каталоге:
import pandas as pd
import datetime
import os
import s3fs
import numpy as np
#Creds for s3
fs = s3fs.S3FileSystem(key=mykey, secret=mysecretkey)
bucket = "s3://mys3bucket/mys3bucket"
#files references the entire bucket.
files = fs.ls(bucket)
for file in files:
fs.download(file,'test.csv')