fsspec и вообще зачем оно нам нужно
Привет! Сегодня я расскажу вам про fsspec и его киллер фичи.
1. Введение
В современной разработке различного ПО и управлении данными, одной из ключевых проблем является работа с разнообразными файловыми системами. Разработчики и системные администраторы сталкиваются с вызовами при интеграции различных хранилищ данных, от локальных дисков до облачных сервисов. Эта множественность и разнообразие сильно усложняют процесс разработки и поддержки приложений, требуя от разработчиков постоянного адаптирования под различные стандарты и протоколы.
Унифицированный подход к управлению файлами является ключевым для повышения эффективности и гибкости разработки. Он позволяет разработчикам сосредоточиться на бизнес-логике приложений, минимизируя затраты времени и ресурсов на решение технических задач, связанных с файловыми системами. Кроме того, подобный подход облегчает масштабирование и интеграцию приложений в различные среды.
Несмотря на наличие различных инструментов и библиотек для работы с файловыми системами, многие из них ограничиваются поддержкой лишь определенных типов или не обеспечивают достаточной гибкости и расширяемости (boto3
, pyhdfs
и тд). Это ведет к необходимости использования множества различных инструментов, что усложняет процесс разработки и поддержки кода.
Неплохим решением данной проблемы, на мой взгляд, является fsspec
или Filesystem Specification — библиотека Python, предоставляющая унифицированный интерфейс для работы с различными файловыми системами. fsspec
абстрагирует операции с файлами, позволяя разработчикам использовать одинаковый код для доступа к файлам, независимо от их расположения и характеристик хранилища. Это значительно упрощает процесс интеграции и обслуживания приложений, работающих с данными. Также огромным плюсом является то, что синтаксис с самыми основными функциями fsspec знаком почти всем разработчикам. По сути она позволяет разработчикам взаимодействовать с файлами на локальных дисках, в облачных хранилищах и других удаленных источниках, используя единый стандартный код.
2. Установка и настройка
Для работы с определенными файловыми системами могут потребоваться дополнительные модули, например, s3fs
для Amazon S3 или gcsfs
для Google Cloud Storage. В данной статье мы посмотрим на пример с гугловых хранилищем.
Для начала работы с fsspec установите библиотеку через pip:
pip install fsspec
pip install fsspec[gcs]
Импортируем модуль:
import fsspec
3. Основы работы с fsspec
Объявляем файловую систему:
fs = fsspec.filesystem('gcs')
Перечисление файлов в каталоге
files = fs.ls('my-bucket/my-folder')
Копирование файла с s3 на s3
Можно так
fs.copy('gs://my-bucket/my-file.txt', 'gs://my-bucket/copy-of-my-file.txt')
А можно так
with fsspec.open('gs://my-bucket/my-file.txt', "rb") as src:
with fsspec.open('gs://my-bucket/copy-of-my-file.txt', "wb") as out:
out.write(src.read())
Удаление файла
fs.rm('gcs://my-bucket/unwanted-file.txt')
Чтение файла с локальной файловой системы
with fsspec.open('path/to/local/file.txt', 'r') as file:
content = file.read()
print(content)
Чтение файла с облачной файловой системы
with fsspec.open('gs://my-bucket/path/to/file.txt', 'r') as file:
content = file.read()
print(content)
Запись в файл на локальном диске
with fsspec.open('path/to/file.txt', 'w') as file:
file.write('Hello, World!')
Запись в файл в облачном диске
with fsspec.open('gs://my-bucket/path/to/file.txt', 'w') as file:
file.write('Hello, World!')
4. Киллер фичи
Чтение одного файла из zip/gzip архивов без предварительной разархивации. Ниже пример с чтением картинки
from PIL import Image
from io import BytesIO
# Путь к ZIP-архиву на S3
s3_path = 'gs:/my-bucket/file.zip'
# Путь к конкретному файлу внутри ZIP-архива
file_in_zip = '**folder/test.png'
# Полный путь для доступа к файлу внутри архива на S3
zip_image_path = f'zip://{file_in_zip}::{s3_path}'
with fsspec.open(zip_image_path, 'rb') as file:
img_data = file.read()
img_buffer = BytesIO(img_data)
image = Image.open(img_buffer)
image.show()
Также можно считывать сразу несколько файлов через шаблоны
# Путь к ZIP-архиву на S3
s3_path = 'gs:/my-bucket/file.zip'
# Путь к конкретному файлу внутри ZIP-архива
file_in_zip = '**folder/*.png'
# Полный путь для доступа к файлу внутри архива на S3
zip_images_path = f'zip://{file_in_zip}::{s3_path}'
files = fsspec.open_files(zip_images_path, "rb")
for file in files:
img_data = file.open().read()
img_buffer = BytesIO(img_data)
image = Image.open(img_buffer)
image.show()
Кэширование файлов
# Открытие файла с механизмом кэширования 'readahead'
with fs.open('my-bucket/file.txt', mode='rb', cache_type='readahead') as f:
data = f.read()
Этот список можно продолжать до бесконечности, так как функционал fsspec
поистине широк. Например, в нём есть некоторая поддержка асинхронности, можно работать по ssh
, есть поддержка уникальных файловых систем, таких как Google Cloud
, и т.д. Со всеми этими и другими функциями можно ознакомиться тут.
5. Поговорим про минусы fsspec
Не умеет генерировать подписанные урлы. Тоесть он не поддерживает автоматическое создание URL-адресов с включенными мерами безопасности, такими как подписи для временного доступа к защищенным ресурсам. В облачных хранилищах, таких как
AWS S3
, подписанные URL-адреса используются для предоставления ограниченного по времени доступа к файлам без необходимости предоставлять полные учетные данные.Ограниченная производительность с очень большими файлами. При работе с очень большими файлами (например, в несколько терабайт)
fsspec
может столкнуться с проблемами производительности. Это может быть связано с тем, чтоfsspec
предназначен для обеспечения универсальности и удобства использования, а не для оптимизации работы с чрезвычайно большими объемами данных. В таких случаях может потребоваться использование более узкого решения, нацеленного на обработку больших файлов (напримерpyspark
).Сложность настройки аутентификации для подключения. Настройка аутентификации в
fsspec
, особенно для подключения к защищенным файловым системам, может быть сложной. Это связано с тем, что разные системы хранения данных требуют различных методов аутентификации, и иногда настройка этих параметров вfsspec
может потребовать дополнительных усилий.
6. Вывод
fsspec значительно упрощает и унифицирует процесс доступа к данным для разработчиков. Его гибкость и широкая поддержка различных хранилищ данных открывают новые возможности в разработке приложений, особенно в областях, где необходим быстрый и надежный доступ к данным из разнообразных источников.