Я довольно новичок в 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 ... (глядя на тип «книга», я предполагаю, что это будет на последнем).
Любая помощь или отзывы о том, как исправить это, будем очень благодарны. Если вам нужна дополнительная информация, чтобы понять, что происходит или что я ищу, спросите пожалуйста.
ConceptualErrors - это список, возвращенный с 'TotalConceptualErrors (sheet)' – Joti
Плохой дизайн, чтобы иметь глобальные вары в ваших программах. Вы должны заставить его вернуть список и установить возвращаемое значение локальной переменной в указанной выше функции. Глядя на вышеприведенный код, я думаю, что он имеет какое-то отношение к тому, как возвращается список.Проверьте строку, на которую вызывается ошибка, и проверьте переменные в этой строке, напечатав их. Списки, словари, строки все повторяются и чаще всего встречаются в Python. Если ваша переменная не является одной из них, она, вероятно, не является итерируемой. – Hrishi
Хорошо, я решил это, назвав его «ConceptualErrors = TotalConceptualErrors (sheet)» внутри функции «TranslatorsPerErrors» и удалив str() в if-блоках. Теперь он выводит словарь, который я просил. Спасибо за вашу помощь! – Joti