Что такое диспетчеры контекста в Python?
На своей работе я недавно узнал о важности использования контекстного менеджера. Мне нужно было создать файл Excel и хранить несколько листов в среде AWS. Сначала я не использовал контекстный менеджер, но через некоторое время обнаружил, что файл сохраняется неправильно, несмотря на то, что делал это дважды в предыдущие месяцы.
Что такое менеджеры контекста?
Контекстные менеджеры позволяют точно назначать и освобождать ресурсы, когда они вам нужны. Оператор with является наиболее распространенным примером менеджера контекста. Предположим, у вас есть две связанные операции, которые вы хотите запустить как пару, разделенные блоком кода. Контекстные менеджеры позволяют сделать именно это.
В первом примере показано хранилище с использованием менеджера контекста.
import pandas as pd # create two data DataFrames df1 = pd.DataFrame({'dataset':['A', 'B', 'C', 'D', 'E']}) df2 = pd.DataFrame({'dataset':[3, 12, 18, 21]}) writer = pd.ExcelWriter('dataframes.xlsx', engine = 'xlsxwriter') df1.to_excel(writer, sheet_name = 'first') df2.to_excel(writer, sheet_name = 'second') # close the DataFrames writer.save()
Однако, несмотря на то, что я всегда работал на своем ПК, я обнаружил, что этот подход был сомнительным в среде AWS. Я рекомендую использовать диспетчер контекста в любом случае после изменчивых результатов в среде AWS.
# Using a context manager, saving in the file happens automatically with pd.ExcelWriter('dataframes.xlsx') as writer: df1.to_excel(writer, sheet_name = 'first', index = False) df2.to_excel(writer, sheet_name = 'second', index = False)
Менеджер контекста также весьма удобен, если у вас есть список DataFrames.
frames = [df1, df2, df3, df4] sheets = ['first', 'second', 'third', 'fourth'] with pd.ExcelWriter('dataframes.xlsx') as writer: for f, frame in enumerate(frames): frame.to_excel(writer, sheets = names[f])
Используя enumerate, я также могу составить список имен для каждого листа по мере того, как перебираю кадры. Довольно просто и по-питоновски, наслаждайтесь!
Спасибо за чтение.
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.