Сценарий и функция дважды перебирают данные

#loops #python-2.7 #xlrd

#циклы #python-2.7 #xlrd

Вопрос:

Я пытаюсь понять, является ли это нормальным поведением в xlrd mod или я чем-то злоупотребляю. Вот код:

 import xlrd
workbook = xlrd.open_workbook('exceptions v2.xlsm')

worksheet = workbook.sheet_by_name('Sheet1')
num_rows = worksheet.nrows - 1
curr_row = -1
data = []
print 'begin loop'
while curr_row < num_rows:
    curr_row  = 1
    row = worksheet.row(curr_row)
    print row
    data.append(row)

print 'out of loop'
  

Когда я запускаю скрипт, он будет печатать begin loop и out of loop дважды вместе со всеми данными в моем развернутом листе. Другими словами, этот цикл while выполняется дважды и останавливается. Я бросил raise SystemExit после печати out of loop , и скрипт остановился там, где я бы его исключил.

Еще одна мысль: конечное использование заключается в создании списка на python путем добавления каждой строки из Excel в список (здесь я называю это данными), и я заметил, что я не получаю дубликатов в своем списке, хотя я вижу, что операторы печати выполняются дважды.

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

1. Этот код вызывается в функции или это весь сценарий? Потому что, если это весь сценарий, похоже, нет причин для того, чтобы он печатал оператор печати дважды. Если это в функции, то имеет смысл, почему у вас нет удвоенных данных, потому что список данных сбрасывается между запусками цикла.

2. Я пробовал это как оба и получал тот же результат. Однако я использовал его как скрипт в нижней части моей реальной программы вместо того, чтобы делать это в новом файле. Когда я открыл новый файл и протестировал его, все работало просто отлично. Но хорошее замечание о сбросе списка, это было полезно. По-видимому, у меня должно быть что-то в моей программе, проходящей через все дважды, и я просто зациклился на xrld, потому что я не очень знаком с этим модом.

Ответ №1:

Ну, я нашел ответ. Проблема была в моих инструкциях импорта.

У меня есть два файла import_kip.py и initialize.py . Я тестировал приведенный выше сценарий xlrd в нижней части initialize.py а затем импортируют initialize.py для import_kip.py а затем импортируют import_kip.py к моему initialize.py файл. Таким образом, по сути, скрипт был запущен обоими import_kip.py и initialize.py . И поскольку скрипт начинался с data = [] , он очищал мой список при каждом запуске, поэтому я не получал дубликатов.

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