2016-02-15 2 views
0

Я работаю над функцией на python, используя библиотеку openpyxl, которая будет загружать столбцы с указанного листа в книгу и выполнять некоторую обработку данных перед возвратом столбцы в списках или массивы numpy.Ячейки «Нет», загруженные в начале столбцов openpyxl

Чтобы загрузить столбцы, я загружаю книгу, получая целевой лист, хранение столбцов, а затем просто итерацию через каждую колонку и добавляя содержимое ячейки списка:

#open the excel file 
    wb = openpyxl.load_workbook(fname, read_only = True) 
    print('\nWorkbook "%s" open...' % (fname)) 

    #get the target sheet 
    sh = wb.get_sheet_by_name(sheet) 
    print('Sheet "%s" aquired...' % (sheet)) 

    #store only the desired columns of the sheet 
    sheetcols = sh.columns 
    columns = [[] for i in range(L)] 
    for i in range(L): 
     columns[i] = sheetcols[cols[i] - 1] 

    #read selected columns into a list of lists 
    print('Parsing desired columns of data...') 
    data = [[] for i in range(L)] 
    #iterate over the columns 
    for i in range(L): 
     #iterate over a specific column 
     print(len(columns[i])) 
     for j in range(len(columns[i])): 
      #store cell contents as a string (for now) 
      data[i].append(columns[i][j].value) 

Некоторые столбцы загрузит с несколькими None элементами в начале их соответствующего списка, которые не соответствуют данным в файле excel. Например, ожидается, что столбец с двумя пустыми ячейками в начале (слева пустой из-за пространства заголовка или любого другого) загрузит два элемента None в начале своего списка, но он может загружать пять или шесть элементов None вместо двух ...

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

Кто-нибудь более знаком с модулем openpyxl или, может быть, просто преуспевает, думают о том, почему эти таинственные дополнительные элементы None попадают в импортированные данные?

+0

Будет ли 'if cell == None: cell =" "' работать? – thefoxrocks

+0

Да, я мог бы справиться с этими дополнительными 'Нет', но я хочу, чтобы избавиться от всех из них. Но когда есть фактические пустые ячейки в столбце, я должен их хранить. Я не могу вытащить все «Нет», потому что в начале столбца или во всех реальных данных могут быть реальные пустые ячейки, и я хочу иметь возможность сравнивать несколько столбцов. Элементы столбцов должны иметь одинаковые индексы. –

+0

Хорошо, так что фактические числа заменяются на 'None's, если я правильно читаю. Интересно. Нет недопустимых символов? – thefoxrocks

ответ

0

Код неполный, но, вероятно, стоит отметить, что поведение для листов с отсутствующими ячейками обязательно несколько непредсказуемо. Например, если рабочий лист имеет только значения в ячейках от D3:G8, какими должны быть его столбцы? openpyxl будет создавать ячейки по запросу для любого заданного диапазона, и я подозреваю, что это то, что вы можете видеть.

ws.rows и ws.columns предоставляются удобством, но вы почти всегда лучше работаете с ws.get_squared_range(…), что должно дать вам немного сюрпризов.

+0

Хм, но вы должны поставить 'ws.get_squared_range() 'с« координатами »диапазона. Если вы их не знаете, это будет выглядеть так: 'ws.get_squared_range (ws.min_column, ws.min_row, ws.max_column, ws.max_row', правильно? Не были бы вызовы' min_column' и т. Д. -detection границ диапазона в любом случае? Почему бы «ws.columns» не могли запускать те же подпрограммы, чтобы найти начальные столбцы? –

+0

Это хороший совет, хотя я изменил код, чтобы сначала определить целевой диапазон , затем перебираем его с помощью 'ws.iter_rows (range_string = ...)'. –

+0

Разница между использованием 'ws.get_squared_range (...)' и 'ws.rows' или' ws.columns' является тонкой. Столбцы или строки всегда будет возвращать либо полные строки или столбцы, и, таким образом, может создавать пустые ячейки в начале этих строк или столбцов, тогда как 'ws.get_squared_range (...)' будет возвращать ячейки только в пределах диапазона. –

Смежные вопросы