python - создает переменные в цикле, затем присваивает - PullRequest
2 голосов
/ 02 октября 2019

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

import openpyxl

months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

for month in months:
    filepath = 'C:\codes\Furnace_time_log\\2019\\' + month + '_2019.xlsx'
    workbook_name = month+'_wb'
    workbook_name =  openpyxl.load_workbook(filepath)
    sheet_name = month+'_sheet'
    sheet_name = workbook_name.get_sheet_by_name('Sheet1')

Из этого я хочу получить 12 объектов листа openpyxl с именами "January_sheet", "February_sheet", ...

Ранее в моем коде у меня было следующееобразец, который делает именно то, что он должен. Вот на чем я основываю логику моего ошибочного кода:

head_wb = openpyxl.load_workbook('C:\codes\Furnace_time_log\head.xlsx')
head_sheet = head_wb.get_sheet_by_name('Sheet 1')

Я работаю с файлом Excel, где каждая строка содержит дату и много другой полезной информации. Если дата строки x указана в январе, мне нужно поместить смежные данные в отдельный документ XLSX («January_2019.xlsx»), который я могу редактировать с помощью объекта January_sheet.

Любой совет, как этого добиться? Кроме того, я не связан с производительностью. Этот код должен запускаться только один раз для полного набора данных. Я понимаю, что, возможно, есть более эффективный способ сделать это, чем одновременно открывать 12 книг и листов openpyxl. При этом приветствуются любые лучшие способы достижения этого.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Я вообще не знаю ваш интерфейс, но вот что я собрал:

import openpyxl

months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

sheets = {}

for month in months:
    filepath = 'C:\\codes\\Furnace_time_log\\2019\\' + month + '_2019.xlsx'
    workbook =  openpyxl.load_workbook(filepath)
    sheet_name = month + '_sheet'
    sheet = workbook_name.get_sheet_by_name(sheet_name)
    sheets[month] = sheet

Предполагается, что ваши листы названы xxxx_month (например, January_month, case-чувствительный), а не Sheet1, как вы изначально использовали. Когда это будет сделано, у вас будет словарь, отображающий название месяца на объект листа.

Дайте мне знать, если что-то, что я сделал, не имеет смысла, и я отредактирую.

0 голосов
/ 02 октября 2019

Я вижу несколько проблем с вашим кодом:

  1. Неправильная escape-последовательность в имени файла.
  2. Переназначение переменных.
  3. Вы пытаетесь создать дверазличные наборы динамических переменных: рабочие книги и листы, без установления связи между ними.

В приведенном ниже коде первая строка сохраняет значение в переменной «имя_ листа». Вторая сохраняет новое значение в той же переменной, изменяя ее значение:

sheet_name = month+'_sheet'
sheet_name = workbook_name.get_sheet_by_name('Sheet1') 

То, что вы пытаетесь сделать, - это динамически создавать имя и значение переменной. Если нет необходимости создавать такой набор переменных, я бы порекомендовал использовать для этого либо список, либо словарь:

months = ['January', 'February', 'March','April', 'May', 'June', 'July', 
          'August', 'September', 'October', 'November', 'December']
wb_format = r'C:\codes\Furnace_time_log\2019\{}_2019.xlsx'
workbooks = dict((month, wb_format.format(month)) for month in months)

Если вы действительно хотите создать эти переменные, посмотрите locals() и globals(), но соблюдайте осторожность.

...