Я выложу свой код ниже.Я пытался создать сценарий автоматического обновления, чтобы создать класс объектов гражданских адресов в файловой базе геоданных, и сценарий функционирует, как и предполагалось, помимо последнего шага: я пытаюсь добавить объединенное поле, которое включает название улицы иназвание улицы (Street, Road, Rue и т. д.), основанное на флаге «до или после» в другом поле (1 - до названия улицы, 2 - после), но я получаю ошибки Unicode.Я относительно новичок в Python, поэтому я не очень разбираюсь в использовании различных настроек Юникода.Я попытался включить:
# -*- coding: utf-8 -*-
в качестве первой строки кода, но безрезультатно.Я получаю следующую ошибку:
Traceback (последний вызов был последним): файл "P: \ AFT \ Sept2018 \ CADB_update_working \ CADB_updateScript_test_complete_a_test_a.py", строка 252, в строке для курсора: UnicodeDecodeE: кодек «utf8» не может декодировать байт 0xe9 в позиции 3: неожиданный конец данных
Я полностью ожидаю, что это будет какая-то простая опечатка или синтаксическая ошибка, которую я не улавливаю, или, возможно, какой-то недостаток в моемсгенерированный CSV, который генерируется из TXT-файла.Проблемный раздел кода приведен ниже:
# uses txt file to write a csv file
txtFile = inFolder + "\\street_types.txt"
csvFile = inFolder + "\\street_types.csv"
with open(txtFile, 'rb') as inFile, open(csvFile, 'wb') as outFile:
in_txt = csv.reader(inFile, delimiter = '\t')
out_csv = csv.writer(outFile)
out_csv.writerows(in_txt)
print "CSV created"
# writes two columns of the csv into 2 lists and then combines them into a dictionary
with open(csvFile,'r') as csvFile:
reader = csv.reader(csvFile, delimiter=',')
next(reader, None)
listA = [] # CD
listB = [] # Display Before Flag
listC = [] # NAME
for row in reader:
listA.append(row[0])
listB.append(row[3])
listC.append(row[1])
# print listA
# print listB
keys = map(int, listA)
values = map(int, listB)
dictionary = dict(zip(keys,values))
print dictionary
keysB = map(int, listA)
valuesB = listC
dictionaryB = dict(zip(keysB,valuesB))
print dictionaryB
# uses that dictionary to update the field just added to teh feature class with the corresponding boolean value
print "Dictionaries made successfully"
update_fields = ["ST_TYPE_CD","ST_NAME_AFTER_TYPE"]
with arcpy.da.UpdateCursor(fc, update_fields) as cursor:
for row in cursor:
if row[0] in dictionary:
row[1] = dictionary[row[0]]
cursor.updateRow(row)
# Adding more fields to hold the concatenated ST_TYPE_CD and STREET_NAME based on ST_NAME_AFTER_TYPE
field_name = "ST_NAME_COMPLETE"
if arcpy.ListFields(fc, field_name):
print "Field to be added already exists"
else:
arcpy.AddField_management(fc, "ST_NAME_COMPLETE", "TEXT")
print "Field added"
field_name = "ST_TYPE"
if arcpy.ListFields(fc, field_name):
print "Field to be added already exists"
else:
arcpy.AddField_management(fc, "ST_TYPE", "TEXT")
print "Field added"
# Populating those added fields
fields = ["ST_TYPE_CD","ST_TYPE","STREET_NAME"]
where = "STREET_NAME IS NOT NULL"
with arcpy.da.UpdateCursor(fc, fields, where) as cursor:
for row in cursor:
if row[0] in dictionaryB:
row[1] = dictionaryB[row[0]]
cursor.updateRow(row)
print "One of two field transcriptions complete"
fields = ["ST_TYPE","STREET_NAME","ST_NAME_COMPLETE","ST_NAME_AFTER_TYPE"]
with arcpy.da.UpdateCursor(fc, fields, where) as cursor:
for row in cursor:
if row[3] == 1:
row[2] = row[0] + " " + row[1]
elif row[3] == 2:
row[2] = row[1] + " " + row[0]
cursor.updateRow(row)
print "Two of two field transcriptions complete"
Если ожидается, что проблема в файле csv, я могу попытаться загрузить его или отобразить фрагмент включенных данных.
I 'Я застрял на этом какое-то время, поэтому любая помощь или совет будут оценены.