Я работаю над программой, где я хочу сравнивать адреса, которые я прочитал из файла csv, в базу данных postgres. (Его плагин для QGis) Я могу успешно установить соединение, а также прочитать данные из базы данных, пока я отправляю запросы без моих собственных параметров.Проблемы с кодированием Python с PostgreSQL Database
Так что я делаю: Я прочитал csv-файл и сохранил его в списке. Затем я выбираю выходной файл. Затем я нажимаю кнопку, которая при щелчке должна сравнивать записи в файле csv с записями в моей базе данных. Если запись из файла csv (почтовый индекс, город, адрес) имеет те же самые свойства в базе данных, я записываю ее в список «Успешные совпадения», если один из них не соответствует, я записываю его в список «Список ошибок» .)
Моя проблема сейчас происходит, когда я исполняю заявление со своими собственными параметрами СКП Сообщение об ошибке я получаю обратно говорит:
Invalid Byte-Sequence for Encoding UTF8: 0xdf 0x65
Я думаю, что ошибка в первом списке заполняю из файла csv. Мои адреса имеют специальные символы, такие как öäüß ...
Вот код, который используется:
This Method writes the succesfully matched addresses to a file, the failed ones to a lineEdit
def write_output_file(self):
compare_input_with_database()
try:
with open(self.outputfile, 'wb') as csvfile:
writer = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
for row in geocoded_list:
writer.writerow(row)
if len(error_list) > 0:
self.writefailedaddresses()
raiseInformation("Es konnten nicht alle Adressen geocodiert werden!")
else:
raiseInformation("Adressen erfolgreich geocodiert!")
except csv.Error:
raiseException("Fehler beim schreiben der Datei")
This method, compares a row entry from the list/csvfile to the database.
def compare_input_with_database():
dbcursor = database_connection.open_connection()
for row in addressList:
entry = str(row[0])
addresssplit = entry.split(';')
try:
resultset = database_connection.select_specific_address(dbcursor, int(addresssplit[0]), addresssplit[1], addresssplit[2])
geocoded_list.append(resultset)
except psycopg2.DatabaseError, e:
raiseException(e)
error_list.append(addresssplit)
database_connection.close_connection()
def select_specific_address(cursor, plz, town, address):
cursor.execute("SELECT plz,ort,strasse,breitengrad,laengengrad from addresses where plz=%s AND ort=%s AND strasse=%s", (plz, town, address))
resultset = cursor.fetchone()
return resultset
This Method reads a csv file and populates it in a list
def loadFileToList(addressfile, dlg):
del addressList[:]
if os.path.exists(addressfile):
if file_is_empty(addressfile):
raiseException("Ungueltige Quelldatei! Quelldatei ist leer!")
return -1
else:
with open(addressfile, 'rb') as csvfile:
filereader = csv.reader(csvfile, delimiter=';')
for row in filereader:
addressList.append(row)
return addressList
else:
raiseException("Pfad der Quelldatei nicht gefunden!")
return -1
Спасибо!
EDIT: Когда я показываю адрес, содержащий специальный charachter он показывает, как «Hauptstra \ xdfe» вместо «Хауптштрассы Извините им плохо с кодировкой, это юникод Значит ли это, что получить посылает к базы данных, как это и я СВАО кодировать его по-разному
EDIT 2: Я посмотрел на orkaround и пытался реализовать его:
def loadFileToList(addressfile, dlg):
del addressList[:]
if os.path.exists(addressfile):
if file_is_empty(addressfile):
raiseException("Ungueltige Quelldatei! Quelldatei ist leer!")
return -1
else:
#with open(addressfile, 'rb') as csvfile:
#filereader = csv.reader(csvfile, delimiter=';')
reader = unicode_csv_reader(open(addressfile))
for row in reader:
addressList.append(row)
return addressList
else:
raiseException("Pfad der Quelldatei nicht gefunden!")
return -1
def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
for row in csv_reader:
yield [unicode(cell, 'utf-8') for cell in row]
Но теперь я получаю следующее сообщение об ошибке при выполнении код: для строки в читателя:
File "C:/Users/Constantin/.qgis2/python/plugins\Geocoder\logic.py", line 46, in unicode_csv_reader yield [unicode(cell, 'utf-8') for cell in row] UnicodeDecodeError: 'utf8' codec can't decode byte 0xdf in position 19: invalid continuation byte
Я просто не понимаю, почему он просто не могу расшифровать это -.-
UPDATE:
Некоторые строки из моего файла CSV:
1190;Wien;Weinberggasse
1190;Wien;Hauptstraße
1190;Wien;Kärnterstraße
Возможный дубликат [недействительной последовательности байтов для кодирования «UTF8»] (http://stackoverflow.com/questions/4867272/invalid-byte-sequence-for-encoding-utf8) – Jason
Я проверил свою базу данных и в разделе Свойства -> Определить -> Кодирование говорит utf8 ... –