TypeError: нехешируемый тип: список?

Я пытаюсь написать файл Excel с помощью XLWT из файла CSV (почтовый индекс в состояние), но когда я открываю CSV и беру имя состояния оттуда, получаю эту ошибку, иначе, если я установил какое-то значение жесткого кода, он выполняется.

import xlwt
import csv
row = 1
excelFile = xlwt.Workbook(encoding='utf-8')
sheet1 = excelFile.add_sheet('SampleData')
sheet1.col(0).width = 5000
sheet1.col(1).width = 5000
sheet1.write(0, 0, "Zip")
sheet1.write(0, 1, "State")
zip = '43215'
with open("usZipToCity.csv", 'r', encoding='utf-8') as csvFile:
    reader = csv.reader(csvFile)
    for row in reader:
        if row:
            if zip in row:
                stateName = row[1]

sheet1.write(row, 0, zip)
sheet1.write(row, 1, stateName)
row += 1
excelFile.save("SampleData.xls")

Отслеживание ошибок:

Traceback (most recent call last):
  File "G:/scrapingtasks/toddkreal_property/Tester.py", line 47, in <module>
    sheet1.write(row, 0, zip)
  File "C:\Users\muhammadhamaadlatif\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xlwt\Worksheet.py", line 1088, in write
    self.row(r).write(c, label, style)
  File "C:\Users\muhammadhamaadlatif\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xlwt\Worksheet.py", line 1139, in row
    if indx not in self.__rows:
TypeError: unhashable type: 'list'

Вы передаете список как ссылку на столбец или строку.

Martijn Pieters 27.10.2018 14:17

Вы повторно использовали row для цикла чтения CSV, поэтому row теперь является списком, а не 1.

Martijn Pieters 27.10.2018 14:18

Теперь я понял, что сделал сленговую ошибку. Спасибо за поправку, сэр. :)

GigaByte 27.10.2018 15:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
359
1

Ответы 1

Как указал Мартин, вы используете row для двух разных целей:

  • держать строку проанализированного csv;
  • для хранения индекса следующей строки файла Excel, который вы напишете.

Самый быстрый способ исправить это - использовать разные имена переменных для каждой цели. Например, вы можете переименовать row в csvrow в строках 13, 14, 15 и 16 предоставленного вами кода.

Если у вас есть больше времени, я предлагаю вам взглянуть на следующий код. Он включает несколько стилистических исправлений вашей исходной реализации, а также функцию write_row(), которая может вас заинтересовать.

import xwlt
import csv

from itertools import count

if __name__ == "__main__":
    # Create an Excel file
    EXCELFILE = xwlt.WorkBook(encoding = "utf-8")
    # Setup a sheet
    SHEET = EXCELFILE.add_sheet('SampleData')
    SHEET.col(0).width = 5000
    SHEET.col(1).width = 5000

    # Define an easy way to write a row of data to SHEET
    ROW_IDX = count()
    def write_row(*args):
        """Writes a row of data into SHEET"""
        row_idx = next(ROW_IDX)
        for col_idx, arg in enumerate(args):
            SHEET.write(row_idx, col_idx, arg)

    # Write the header (first row)
    write_row("Zip", "State")

    # Set ZIP to the zip code we are interested in
    ZIP = '43215'

    # Parse the csv file
    with open("usZipToCity.csv", encoding = "utf-8") as CSVFILE:
        for CSVROW in csv.reader(CSVFILE):
            if ZIP in CSVROW:
                # CSVROW[1] contains a state name
                write_row(ZIP, CSVROW[1])

    # Write the Excel file to disk
    EXCEFILE.save("SampleData.xls")

Примечание: мне не ясно из вашего кода, ожидаете ли вы найти несколько совпадающих строк в файле csv. В противном случае вам, вероятно, следует использовать break после первого матча.

Другие вопросы по теме