Основные способы загрузки и выполнения кода из файлов Python в Pandas
Как эффективно и безопасно использовать функции из внешнего .py файла для обработки DataFrame?
Самый простой и рекомендуемый способ – стандартный импорт модуля. Файл utils.py с функцией transform(df) должен находиться в одной директории с основным скриптом или в каталоге, добавленном в sys.path.
# utils.py
import pandas as pd
def transform(df):
df['new_col'] = df['value'] * 2
return dfобработка больших данных python (обработка больших данных в python)
# main.py
import pandas as pd
import utils
df = pd.DataFrame({'value': [1,2,3]})
df = utils.transform(df)
print(df)очистка данных python (очистка данных в python)
value new_col 0 1 2 1 2 4 2 3 6
Python подготовка данных (подготовка данных в python)
При необходимости добавить путь:
import sys
sys.path.insert(0, '/path/to/modules')
import utilsPython работа с большими данными (работа с большими данными в python)
Импорт гарантирует изолированное пространство имен, возможность переиспользования и поддержку инструментами разработки.
Как выполнить скрипт из файла без создания модуля, используя exec?
Если файл не предназначен для импорта как модуль (содержит только последовательность действий), можно прочитать его содержимое и передать в функцию exec().
with open('script.py', 'r') as f:
code = f.read()
exec(code)генерация данных python (генерация данных в python)
При этом все переменные, созданные в скрипте, попадают в глобальную область видимости. Чтобы избежать засорения, можно передать отдельный словарь:
namespace = {}
exec(code, namespace)
# теперь доступ к результатам через namespace
if 'result_df' in namespace:
df = namespace['result_df']Python код символа (код символа в python)
Типичная ошибка: внутри exec нельзя напрямую обратиться к локальным переменным функции, где вызывается exec.
Решение: всегда явно передавать словарь namespace и извлекать нужные объекты после выполнения.
Как динамически загрузить модуль по полному пути файла?
Модуль importlib позволяет загрузить Python файл как модуль, даже если он не находится в стандартных путях. Это удобно, когда имя файла определяется во время выполнения.
import importlib.util
import sys
file_path = '/home/user/custom_functions.py'
module_name = 'custom_functions'
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules[module_name] = module
df = module.apply_my_rule(df)код из файла python (код из файла python)
После загрузки модуль можно использовать как обычный импортированный объект.
Частая проблема: повторная загрузка одного и того же файла приводит к созданию нового модуля, не заменяя старый.
Решение: проверять, загружен ли уже модуль с таким именем, и удалять из sys.modules при необходимости.
Как выполнить файл как скрипт и получить его глобальные переменные?
Функция runpy.run_path() запускает файл в изолированном пространстве и возвращает словарь всех глобальных переменных, созданных в процессе выполнения.
import runpy
vars_dict = runpy.run_path('/path/to/script.py')
dataframe = vars_dict['df'] # если в скрипте была переменная dfобработка данных на python (обработка данных на python)
Этот подход прост и не требует ручного управления модулями. Подходит для скриптов, создающих единственный результат.
Проблема: файл выполняется каждый раз при вызове, не кэшируется.
Решение: для повторного использования лучше сохранить полученный модуль или переменную.
Как безопасно выполнить только отдельные выражения из файла?
Если файл содержит только выражения (например, математические формулы), можно использовать eval() для одной строки или ast.literal_eval(), если файл содержит литералы (словари, списки).
with open('expression.txt') as f:
formula = f.read().strip()
result = eval(formula, {'__builtins__': {}}, {'df': df})
Однако eval крайне небезопасен; рекомендуется избегать его с непроверенными данными.
Риски: eval может выполнить произвольный код, включая удаление файлов.
Альтернатива: использовать библиотеку numexpr или pandas.eval() для выражений, работающих с DataFrame.