скачать файл с помощью 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')
Другие вопросы по тегам