TypeError: unhashable тип: список? - PullRequest
       10

TypeError: unhashable тип: список?

0 голосов
/ 27 октября 2018

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

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'

1 Ответ

0 голосов
/ 27 октября 2018

Как отметил Мартин, вы используете 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 после первого матча.

...