2013-08-12 6 views
0

Я довольно новичок в Python (и в модуле xlrd), поэтому мой код, вероятно, не так компактен, как мог бы быть. Я просто использую его для анализа некоторых данных, поэтому для меня важнее получить то, что я делаю, а не для того, чтобы сделать код максимально компактным (хотя я надеюсь на улучшение, поэтому не стесняйтесь давать мне консультирование по вопросам самого кодирования, при условии, вам удастся объяснить это «новичку»: р)Создание словаря из xlsx: TypeError: аргумент типа «Книга» не итерируется

, как говорится, вот мой вопрос:

Контекст

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

короткий фрагмент из XLSX (чтобы дать вам представление о кодах в двух колонках):

1722_Z1_CF5  1722_HT_EV_Z1_F1 

1722_Z1_CF1  1722_PE_AL_Z1_F1 

1722_Z1_CF9  1722_PE_EVC_Z1_F1 

1722_Z1_CF5  1722_PE_LH_Z1_F1 

Как вы можете видеть, концептуальная ошибка «1722_Z1_CF5» было сделана 2 разных людьми ('1722_HT_EV_Z1_F1' и '1722_PE_LH_Z1_F1). Словарь для этого фрагмента будет выглядеть примерно так:

1722_Z1_CF5: 1722_HT_EV_Z1_F1, 1722_PE_LH_Z1_F1 
1722_Z1_CF1: 1722_PE_AL_Z1_F1 
1722_Z1_CF9: 1722_PE_EVC_Z1_F1 

кодекса

ниже код, что я пытался сделать, чтобы создать словарь.

def TranslatorsPerError(sheet): 

    TotalConceptualErrors(sheet) 

    TranslatorsPerError = {} 

    for row_index in range(sheet.nrows): 
     if sheet.cell(row_index,0).value in ConceptualErrors and sheet.cell(row_index,0).value not in TranslatorsPerError: 
      TranslatorsPerError[str(sheet.cell(row_index,0).value)]=[str(sheet.cell(row_index,1).value),]   

     if sheet.cell(row_index,0).value in ConceptualErrors and sheet.cell(row_index,0).value in TranslatorsPerError: 
      TranslatorsPerError[str(sheet.cell(row_index,0).value)].append(str(sheet.cell(row_index,1).value)) 

return TranslatorsPerError 

«TotalConceptualErrors» является функцией Я создал, которая возвращает список («ConceptualErrors») концептуальные коды ошибок из первого столбца без дубликатов (и отфильтровывает некоторую другую информацию, которая также присутствовала в первом столбец, поэтому я должен был сначала использовать этот).

Проблема

Проблема заключается в том, что эта функция продолжает давать мне ошибку: TypeError: аргумент типа «Книга» не Iterable

Я знаю, что проблемы с итерируемыми иногда может быть решена забрасывая определенные вещи в другой тип, но я не уверен, как я должен решить эту проблему. Я попытался использовать 'str()' для разных элементов, но это не решило проблему. Может быть, это как-то связано с моим кодом, может быть, с характером словарей или xlrd ... (глядя на тип «книга», я предполагаю, что это будет на последнем).

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

ответ

0

Где находится ConceptualErrors?

+0

ConceptualErrors - это список, возвращенный с 'TotalConceptualErrors (sheet)' – Joti

+0

Плохой дизайн, чтобы иметь глобальные вары в ваших программах. Вы должны заставить его вернуть список и установить возвращаемое значение локальной переменной в указанной выше функции. Глядя на вышеприведенный код, я думаю, что он имеет какое-то отношение к тому, как возвращается список.Проверьте строку, на которую вызывается ошибка, и проверьте переменные в этой строке, напечатав их. Списки, словари, строки все повторяются и чаще всего встречаются в Python. Если ваша переменная не является одной из них, она, вероятно, не является итерируемой. – Hrishi

+1

Хорошо, я решил это, назвав его «ConceptualErrors = TotalConceptualErrors (sheet)» внутри функции «TranslatorsPerErrors» и удалив str() в if-блоках. Теперь он выводит словарь, который я просил. Спасибо за вашу помощь! – Joti

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