Использование fsspec в команде pandas.DataFrame.to_csv

Я хочу записать csv-файл из фрейма данных pandas на удаленном компьютере, подключающемся через smtp-ssh. Кто-нибудь знает, как правильно добавить параметр storage_options?

В документации Pandas говорится, что я должен использовать некоторый dict в качестве значения параметра. Но я не понимаю, что именно.

      hits_df.to_csv('hits20.tsv', compression='gzip', index='False', chunksize=1000000, storage_options={???})

Каждый раз, когда я получал ValueError: storage_options passed with file object or non-fsspec file path

Что я делаю неправильно?

3 ответа

Pandas поддерживает fsspec , что позволяет вам легко работать с удаленными файловыми системами и абстрагироваться от s3fs для Amazon S3 и gcfs для Google Cloud Storage (и других бэкэндов, таких как (S)FTP, SSH или HDFS). В частности, s3fs очень удобен для выполнения простых операций с файлами в S3, потому что boto часто довольно сложно использовать.

Аргумент позволит вам предоставить пандам s3fs . аргументы

Вы можете указать профиль AWS вручную, используяstorage_optionsкоторый принимает дикт. Пример ниже:

      import boto3

AWS_S3_BUCKET = os.getenv("AWS_S3_BUCKET")
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
AWS_SESSION_TOKEN = os.getenv("AWS_SESSION_TOKEN")

df.to_csv(
    f"s3://{AWS_S3_BUCKET}/{key}",
    storage_options={
        "key": AWS_ACCESS_KEY_ID,
        "secret": AWS_SECRET_ACCESS_KEY,
        "token": AWS_SESSION_TOKEN,
    },
)

Вы найдете набор значений для использования, поэкспериментировав непосредственно с серверной реализации частьюSFTPFileSystem . Какие бы кварги вы ни использовали, это те же самые, которые войдут в stoage_options. Краткая история: paramiko - это не то же самое, что SSH в командной строке, поэтому потребуется некоторое тестирование.

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

      fs = fsspec.implementations.sftp.SFTPFileSystem(...)
# same as fs = fsspec.filesystem("ssh", ...)
with fs.open("my/file/path", "rb") as f:
    pd.read_csv(f, other_kwargs)

Если у вас нет доступа к облачному хранилищу, вы можете получить доступ к общедоступным данным, указав анонимное соединение, подобное этому

      pd.read_csv('name',<other fields>, storage_options={"anon": True})

Иначе надо пройти storage_options в формате dict вы получите name а также key вашим хостом облачной виртуальной машины (включая Amazon S3, Google Cloud, Azure и т. д.)

      pd.read_csv('name',<other fields>, \
           storage_options={'account_name': ACCOUNT_NAME, 'account_key': ACCOUNT_KEY})
Другие вопросы по тегам