Как я могу заменить 'ß' на 'ss' в таблице атрибутов шейп-файла (arcmap)?Ошибка ASCII - PullRequest
1 голос
/ 14 мая 2019

Я действительно новичок в написании кода на Python, поэтому, пожалуйста, ответьте подробно и не слишком резко. Я пытаюсь заменить умножение 'ß' на немецком языке в таблице атрибутов шейп-файла на 'ss' и делаю это:используя калькулятор поля, где вы можете добавить блок кода Python.

Это то, что я пробовал до сих пор:

def ecode(file, name, test):
    test.decode("utf-8")
    test.replace("\xe1", "ss")
    test.encode("utf-8")
    return test

Вместо "\ xe1" я также использовал "U + 00DF" и "\ xdf".

Это сообщение об ошибке появляется:

ОШИБКА: кодек ascii не может кодировать символ u '\ xdf' в позиции 11: порядковый номер не в диапазоне (128)

название улицыв этом поле таблицы атрибутов находится «Zuccalistraße 21a», поэтому, очевидно, ß - это проблема, выходящая за пределы диапазона ASCII (там она> число 200).Что я могу сделать, чтобы заменить его?Я искал в Интернете в течение 5 часов ....

Хотел бы получить ответы на некоторые вопросы!С уважением, Айла

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Вы можете использовать комбинацию casefold и capitalize для python3

In [6]: s = 'Zuccalistraße 21a'                                                                                                               

In [7]: s.casefold()                                                                                                                          
Out[7]: 'zuccalistrasse 21a'

In [8]: s.casefold().capitalize()                                                                                                             
Out[8]: 'Zuccalistrasse 21a'

Для python2 функции decode, replace и encode не являются in-place функцией, но они возвращают значение, поэтому вам необходимо присвоить возвращаемое значение функции переменной, чтобы сделать твой код.

Также обратите внимание на # coding=utf-8, объявленный выше. Это соответствует PEP-263

# coding=utf-8

s = 'Zuccalistraße 21a'
s = s.decode("utf-8").replace(u"\xdf", "ss").encode("utf-8")
print(s)

Выход будет

Zuccalistrasse 21a
1 голос
/ 14 мая 2019

decode, encode и replace не работают на месте. Попробуйте test = test.decode('utf-8'), test = test.encode('utf-8') и test = test.replace("\xe1", "ss").

Это означает, что строки decode и replace не влияют на test. Затем третья строка пытается encode объект, , но он не был декодирован , так что это не работает.

Тем не менее, у вас все еще будут проблемы после этого. Вот что я бы сделал:

test = test.decode("utf-8")
test = test.replace(u"\xdf", "ss")
test = test.encode("utf-8")

или

test = test.decode("utf-8")
test = test.replace(u"ß", "ss")
test = test.encode("utf-8")

в зависимости от того, что вам наиболее удобно читать.

Вы также не можете декодировать / кодировать его и просто делать test = test.replace(u"\xdf".encode("utf-8"), "ss") или test = test.replace("ß", "ss"), но обычно лучше обрабатывать unicode объекты, поэтому я бы сказал, что декодирование и кодирование - это хорошая практика.

0 голосов
/ 21 мая 2019

Так что, очевидно, это проблема с декодированием.Когда я пытаюсь

def ecode(file, name, test):
    test=test.decode("utf-8")
    test=test.replace(u"\xdf", "ss")
    test=test.encode("utf-8")
    return test

, я получаю сообщение об ошибке:

Файл "C: \ Python27 \ ArcGIS10.2 \ Lib \ encodings \ utf_8.py", line16, в кодеках возврата декодирования.utf_8_decode (input, errors, True)

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xdf' в позиции 11: порядковый номер не в диапазоне (128)

Теперь яполучил ответ на проблему: я обнаружил, что когда вы вводите

import sys
reload(sys)
sys.setdefaultencoding("utf8")

в функцию, она отлично работает !!Так что спасибо за попытку помочь мне, хорошего дня:)

Ура, Айла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...