Задать вопрос

Как перехватить исключение pyo3_runtime.PanicException при использовании pandas и calamine?

Я использую pandas с движком calamine для чтения Excel-файлов в формате .xls и .xlsx.

Столкнулась с проблемой, что некоторые excel-файлы повреждены, и при попытке их чтения возникает паника на уровне Rust с сообщением:
thread '<unnamed>' panicked at C:\Users\runneradmin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\calamine-0.24.0\src\cfb.rs:258:41:
slice index starts at 45368320 but ends at 43228735
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
pyo3_runtime.PanicException: slice index starts at 45368320 but ends at 43228735


Вот часть моего кода:
import pandas as pd

try:
    excel_data = pd.read_excel(txt_file_path, skiprows=cnt_string, sheet_name=filename,
                               na_values=['NULL'], engine='calamine')
except Exception as e:
    print(f'Ошибка при чтении файла {txt_file_path}: {e}')


Однако, перехват исключений через except Exception не помогает предотвратить аварийное завершение скрипта. Как правильно перехватить это исключение и обработать его, чтобы мой скрипт продолжал выполнение даже при ошибке чтения поврежденного файла?

Примечание: Я не хотела бы использовать альтернативную библиотеку для чтения Excel-файлов, так как это потребует значительных изменений в коде.
  • Вопрос задан
  • 85 просмотров
Подписаться 1 Средний 5 комментариев
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Если сторонняя библиотека крашит python процесс то вам просто надо запускать
еще один процесс-камикадзе (excel-kamikadze.py), который даже если падает - не оказывает влияние на основной.
Эта техника используется часто в акторах Erlang/OTP.

Как получить данные назад из excel-kamikadze.py. Тут - много вариантов. Можно создавать временный
файл (XML/JSON куда передавать нужные результаты парсинга). Можно выдать их в поток STDOUT.

import subprocess

result = subprocess.run(["/usr/bin/python3", "kamikadze.py"], stdout=subprocess.PIPE) 
output = result.stdout.decode("utf-8")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы