2013-08-21 3 views
1

Я использую пакеты python xlrd и xlwt для чтения и записи из Excel-таблиц с использованием python. Однако я не могу понять, как написать код для решения моей проблемы.лучший способ проверить каждую ячейку таблицы на каждую ячейку другой?

У меня есть столбец в моей первой электронной таблице, который имеет имена состояний в виде двух буквенных аббревиатур и полного имени (некоторые все строчные буквы, некоторые с первой буквой, заглавные буквы). Я пытаюсь написать другой лист, который читает имена на первом листе, видит, соответствуют ли они именам на втором листе и записывает их на третий лист в виде сокращений состояний, найденных на втором листе. Имеет ли это смысл?

в любом случае, не делая пятьдесят отдельных циклов «для», я не уверен, как это сделать. Вот что я до сих пор, но запустил его, написал пустой первый столбец.

import xlrd #reads 
import xlwt #writes 

input_book = xlrd.open_workbook("file_path_here") 
input_sheet = input_book.sheet_by_index(0) 
state_book = xlrd.open_workbook("file_path2_here") 
state_sheet = state_book.sheet_by_index(0) 
output_book = xlwt.Workbook() 
output_sheet = output_book.add_sheet('test') 

for row in range(input_sheet.nrows): 
    state = input_sheet.cell_value(row, colx=1) #state names are in col 1 
    Value1 =input_sheet.cell_value(row, colx=2) #data being left unchanged, just copied to output sheet 
    Value2 =input_sheet.cell_value(row, colx=3) 
    Value3 =input_sheet.cell_value(row, colx=4) 
    for name in range(state_sheet.nrows): #a sheet with state names in col 0, state abrevs in col 1 
     state_name = state_sheet.cell_value(name,colx=0) 
     state_abrev = state_sheet.cell_value(name, colx=1) 
     if state.lower() == state_name: 
      output_sheet.write(row,0,state_abrev) 
    output_sheet.write(row,1,Value1) 
    output_sheet.write(row,2,Value2) 
    output_sheet.write(row,3,Value3) 

print ('done') 
output_book.save('output.xls') 

ответ

2

Это звучит как словарь - первый создать словарь

state_abbrs = {} 
for name in range(state_sheet.nrows): #a sheet with state names in col 0, state abrevs in col 1 
    state_name = state_sheet.cell_value(name, colx=0) 
    state_abrev = state_sheet.cell_value(name, colx=1) 
    state_abbrs[state_name.lower()] = state_abbr 

Затем использовать:

for row in range(input_sheet.nrows): 
    state = input_sheet.cell_value(row, colx=1) #state names are in col 1 
    Value1 = input_sheet.cell_value(row, colx=2) #data being left unchanged, just copied to output sheet 
    Value2 = input_sheet.cell_value(row, colx=3) 
    Value3 = input_sheet.cell_value(row, colx=4) 

    output_sheet.write(row, 0, state_abbrs.get(state.lower(), '') 
    output_sheet.write(row, 1, Value1) 
    output_sheet.write(row, 2, Value2) 
    output_sheet.write(row, 3, Value3) 
+0

Отличная идея. Я подумал об этом, но я не слишком хорошо знаком со словарями. Тем не менее, я попробовал и получил: raise Exception («Неожиданный тип данных% r»% type (label)) Исключение: Неожиданный тип данных

+0

гм, очевидно, не прав; идея заключается в том, что вместо повторения по столбцам перед вашей 'для строки в диапазоне (input_sheet.nrows)' вы читаете содержимое другого листа в словаре, а затем используйте его. –

+0

ага. Попался. Сказал вам, что я не знаком со словарями! ха-ха. Спасибо за помощь. –

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