Я пытаюсь написать файл 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'
Вы повторно использовали row
для цикла чтения CSV, поэтому row
теперь является списком, а не 1
.
Теперь я понял, что сделал сленговую ошибку. Спасибо за поправку, сэр. :)
Как указал Мартин, вы используете row
для двух разных целей:
Самый быстрый способ исправить это - использовать разные имена переменных для каждой цели. Например, вы можете переименовать 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
после первого матча.
Вы передаете список как ссылку на столбец или строку.