Использование 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})