Skip to main content

sentexts

Python-библиотека для работы с текстами судебных решений в Yandex Object Storage. Позволяет скачивать и читать .txt, отправлять свои тексты в хранилище и удалять локальные копии.

Установка

Требуется Python 3.10 или новее. Из корня проекта:

python -m venv .venv
# Linux/macOS:
source .venv/bin/activate
# Windows PowerShell:
# .venv\Scripts\Activate.ps1
python -m pip install .

В PyCharm выберите Python из созданной .venv.

Настройка

from sentexts import Sentexts

texts = Sentexts()
print(texts.settings.config_path)
print(texts.settings.env_path)

Без аргументов Sentexts() хранит настройки в стандартной папке конфигурации пользователя вашей ОС. При создании объекта там появляются отсутствующие config.json и .env. Команды выше покажут оба пути. Существующие файлы сохраняются.

Чтобы выбрать другую папку, передайте её в конструктор строкой или Path:

texts = Sentexts(settings_path="settings/project")

Папка создаётся при необходимости. Для независимых наборов настроек и ключей используйте разные папки:

first = Sentexts("settings/first")
second = Sentexts("settings/second")

Каждый объект читает и сохраняет свой JSON и свой .env. Обновление настроек или ключей одного объекта не переключает файлы другого. Каталог локальных текстов выбирается отдельно через storage_dir.

Для скачивания текстов укажите ключ с правом чтения в .env:

AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY

Ввести или изменить ключи можно и через API:

texts.update_env()

Метод последовательно запросит Access Key и Secret Access Key. Символы при вводе в терминале не отображаются. Оба значения обязательны и сразу сохраняются в выбранный .env; вызывать save_settings() для них не нужно.

Для отправки текстов нужен ключ с правом записи. Для шаблона есть .env.example. Не включайте файл с ключом в Git и не сохраняйте ключ в JSON.

Папку локальных копий и адрес хранилища можно задать из Python:

from pathlib import Path

Path("my_texts").mkdir(exist_ok=True)
texts.update_settings(
    storage_dir="my_texts",
    cloud_folder="s3://sentexts-corpus-73fa/Судебные решения",
)
texts.save_settings()
  • storage_dir — существующая папка, предназначенная только для текстов. Допустимы строка и Path, включая Windows-пути. Относительный путь считается от текущего рабочего каталога и фиксируется при выборе папки.
  • cloud_folder — адрес вида s3://бакет/папка. Для корня хранилища используйте s3://sentexts-corpus-73fa/. Пробелы, Unicode и % передавайте как есть.

Если настройки ещё не заполнены, используются ./texts и s3://sentexts-corpus-73fa/texts/, с предупреждением. Папка ./texts создаётся при необходимости. Для ручного редактирования JSON есть config.example.json.

update_settings() проверяет весь набор параметров до изменения настроек. Сохранение в JSON выполняется отдельно через save_settings(). Смена локальной папки не перемещает и не удаляет существующие файлы.

Чтение текстов

one = texts.read("решение")
# {"решение.txt": "текст решения"}

many = texts.read(["решение", "другое решение.TXT"])
present = texts.exists("решение.txt")
names = texts.list_local_files()

read() возвращает словарь имя файла → текст. Если локальная копия уже есть, она читается без обращения к хранилищу. Иначе файл скачивается в storage_dir. В read() можно передать имя без расширения — после проверки к нему добавится .txt. Полные имена с .txt/.TXT сохраняются как переданы; другие расширения не поддерживаются. Ключи результата всегда содержат полные имена файлов. Поддерживаются Unicode и пробелы. list_local_files() возвращает отсортированный список имён.

По умолчанию используется UTF-8. Другую кодировку можно указать явно:

texts.read("решение.txt", encoding="cp1251")

Если файла нет в хранилище, выдаётся CloudFileNotFoundWarning: имя пропускается, а чтение остальных файлов продолжается. При запросе единственного отсутствующего файла результат — {}. Если самого хранилища нет, возникает CloudFolderError. Отсутствие файлов по выбранному префиксу также приводит к предупреждению о файле.

При другой ошибке чтение останавливается. Уже скачанные полные копии остаются; неполные файлы не становятся локальными копиями. Существующие копии автоматически не обновляются из облака.

Отправка текстов

from pathlib import Path

uploaded = texts.upload(Path("to_upload/решение.txt"))
# {"решение.txt": "s3://sentexts-corpus-73fa/решение.txt"}

texts.upload([
    Path("to_upload/первое.txt"),
    Path("to_upload/второе.TXT"),
])

upload() принимает один путь или набор путей и возвращает словарь имя файла → адрес в хранилище. Файлы отправляются в выбранный cloud_folder под своими именами. Локальные подпапки в адрес не включаются.

Поддерживаются обычные .txt/.TXT размером до 5 ГиБ. Весь список проверяется до начала отправки. Файлы из разных папок с одинаковым именем не допускаются; повтор одного и того же пути отправляется один раз.

По умолчанию существующий файл не заменяется: возникает CloudFileExistsError. Чтобы разрешить замену, укажите:

texts.upload(Path("to_upload/решение.txt"), overwrite=True)

При ошибке отправка останавливается, а уже отправленные файлы остаются в хранилище. Исходные файлы и локальные копии не меняются.

После замены облачного файла локальная копия продолжит использоваться при чтении. Чтобы скачать обновлённый текст:

texts.cleanup(["решение.txt"])
texts.read("решение.txt")

Удаление локальных копий

deleted = texts.cleanup(["решение.txt", "другое решение.TXT"])
# список pathlib.Path удалённых файлов

texts.cleanup([])  # ничего не удаляет
texts.cleanup()    # удалить все локальные .txt/.TXT

Очистка выполняется только по вызову пользователя и затрагивает выбранную локальную папку. Файлы в облаке не удаляются. Подкаталоги и символические ссылки пропускаются.

Все имена проверяются до удаления. Повторы и отсутствующие файлы пропускаются. Если файлов несколько, то передавать их нужно списком. При ошибке удаления операция останавливается; уже удалённые копии не восстанавливаются.

Ошибки

Ошибки облачного доступа доступны в sentexts.cloud:

Ошибка Значение
MissingCredentialsError В выбранном .env не указан ключ.
CloudAuthError Ключ не прошёл проверку.
CloudPermissionError У ключа нет нужных прав.
CloudFolderError Ошибочный или отсутствующий бакет.
CloudConnectionError Не удалось обратиться к хранилищу.
CloudFileExistsError Файл уже существует, а замена не разрешена.
CloudError Другая ошибка облачного доступа.

CloudFileNotFoundWarning — предупреждение о пропущенном файле; им можно управлять стандартным модулем warnings.

Неверные настройки вызывают sentexts.config.ConfigError, небезопасные имена — sentexts.storage.UnsafePathError. Ошибки локальной файловой системы и декодирования текста передаются вызывающему коду.

Metadata

Release files for sentexts 0.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sentexts 0.4.2
File Size Uploaded Provenance Actions
sentexts-0.4.2.tar.gz 25.9 kB Without provenance Details for sentexts-0.4.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for sentexts 0.4.2
File Interpreter ABI Platform Actions
sentexts-0.4.2-py3-none-any.whl Python 3 none any Details for sentexts-0.4.2-py3-none-any.whl

Total release size: 39.4 kB

Release files / sentexts-0.4.2.tar.gz

Download URL sentexts-0.4.2.tar.gz
Size 25.9 kB
Tags Source
SHA-256 checksum
How to use checksums
3ad74431f4240e5e01758fce503dc4baf1b0bc64818c9d6d715420b88ac20a6f
BLAKE2b-256 checksum
How to use checksums
fa6627d75bcdff050a4800cad62edf78b7f54d282f729a8ad7a3a369ac9c7ec9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.17

Release files / sentexts-0.4.2-py3-none-any.whl

Download URL sentexts-0.4.2-py3-none-any.whl
Size 13.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
df0887f0475175ad557494213f7c841d6ec564a10cde6a25c3dc1b54015813d7
BLAKE2b-256 checksum
How to use checksums
265dcaa732abe84afe879f49debfefba25e71aa680dd7e68c6cb83613fec4133
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.17

Security for sentexts 0.4.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.4.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page