Как пропустить загрузку файла, если он уже загружен в память с помощью Python?

#python #python-3.x #if-statement #environment-variables #global-variables

Вопрос:

У меня есть следующий код, в котором я пытаюсь избежать загрузки symspell.pkl файла, как только он уже загружен в память:

 from symspellpy import SymSpell

if 'sym_spell' in globals():
    print('sym_spell is already loaded!')
    sym_spell = global()['sym_spell']
esle:
    print('loading sym_spell...')
    sym_spell = SymSpell(max_dictionary_edit_distance=5, prefix_length=7)
    sym_spell.load_pickle('symspell.pkl')
 

но, похоже, python всегда выполняет else оператор, даже если if он есть True .

Ниже приведены мои вопросы:

  • Может ли кто-нибудь объяснить, почему Python всегда выполняет else оператор здесь?
  • Является ли то, что я пробовал, правильным способом пропустить загрузку файла, если он уже загружен в память в Python? Если нет, то есть ли лучший способ?

Я использую python3.8.2.

Заранее спасибо.

Ответ №1:

Я не понял, что вы пытаетесь сделать, но это if утверждение всегда ложно, потому что в глобалах нет «sym_spell». Я думаю, что вы пытаетесь проверить «SymSpell», а не «sym_spell».

Редактировать :

Является ли то, что я пробовал, правильным способом пропустить загрузку файла, если он уже загружен в память в Python? Если нет, то есть ли лучший способ?

Нет, я не думаю, что есть способ сделать то, о чем вы точно просите. Но если ваш файл очень огромен и вы не хотите загружать одни и те же данные снова, снова и снова. Тогда это лучшее решение для вас. Вы можете заглянуть в лабораторию Jupyter или в записную книжку Jupyter.
Лаборатория Юпитера :

JupyterLab: Интерфейс ноутбука следующего поколения Jupyter JupyterLab-это интерактивная веб-среда разработки для ноутбуков, кода и данных Jupyter. JupyterLab отличается гибкостью: настраивает и организует пользовательский интерфейс для поддержки широкого спектра рабочих процессов в области обработки данных, научных вычислений и машинного обучения. JupyterLab является расширяемым и модульным: пишите плагины, которые добавляют новые компоненты и интегрируются с существующими.

Записная книжка Юпитера :

Записная книжка Jupyter-это веб-приложение с открытым исходным кодом, которое позволяет создавать и обмениваться документами, содержащими живой код, уравнения, визуализации и повествовательный текст. Использование включает в себя: очистку и преобразование данных, численное моделирование, статистическое моделирование, визуализацию данных, машинное обучение и многое другое.

Здесь вы можете загрузить свои данные один раз, и без импорта этих данных вы можете использовать их несколько раз. Вы можете протестировать его прямо сейчас из своего браузера, чтобы посмотреть, как оно работает. Оттуда на официальном сайте. Я думаю, что это было бы очень полезно для вас.

Комментарии:

1. Спасибо за ответ. Да, я действительно проверяю sym_spell , и, как я уже сказал, это if утверждение верно.

2. Извините, но я имею в виду, что это не ответ на мой вопрос.

3. Я не совсем понял твой вопрос. Пожалуйста, приведите пример, если это возможно!

4. Не кажется ли вам, что python всегда выполняет оператор else, даже если оператор if истинен , ваш вопрос? И разве мое решение не решило вашу проблему?

5. ОК. В самый первый раз, когда я запускаю свой скрипт, sym_spell in globals() = = False, и он выполняет else инструкцию. Когда я запускаю во второй раз sym_spell in globals() == True, и он должен выполнить else инструкцию.

Ответ №2:

Я публикую свое исправление на всякий случай, если это может быть полезно.

После многих попыток я заставил его работать с помощью builtins модуля (вместо globals() ) и try/except оператора, как показано ниже:

 import builtins
from symspellpy import SymSpell    

try:
    if builtins.sym_spell:
        print('sym_spell is already loaded!')
        sym_spell = builtins.sym_spell
except:
    print('sym_spell is not yet loaded! loading sym_spell...')
    sym_spell = SymSpell(max_dictionary_edit_distance=5, prefix_length=7)
    sym_spell.load_pickle('symspell.pkl')
    builtins.sym_spell = sym_spell