Sposobem na rozwiązanie tego problemu jest do podjęcia decyzji, w którym znaki są dozwolone (różne systemy mają różne zasady ważnych identyfikatorów.
Po zdecydować na jakie znaki są dozwolone, napisać dozwolony() orzecznik i podklasy dict do użytku z str.translate:
def makesafe(text, allowed, substitute=None):
''' Remove unallowed characters from text.
If *substitute* is defined, then replace
the character with the given substitute.
'''
class D(dict):
def __getitem__(self, key):
return key if allowed(chr(key)) else substitute
return text.translate(D())
funkcja ta jest bardzo elastyczna to niech Ci łatwo określić zasady podejmowania decyzji, które są przechowywane i tekst, który tekst jest albo zastąpione lub usunięte..
Oto prosty przykład stosując regułę „pozwalają jedynie znaki, które są w Unicode kategorii L”:
import unicodedata
def allowed(character):
return unicodedata.category(character).startswith('L')
print(makesafe('the*ides&of*march', allowed, '_'))
print(makesafe('the*ides&of*march', allowed))
Ten kod produkuje bezpieczne wyjście następująco:
the_ides_of_march
theidesofmarch
"Mój międzynarodowy tekst: åäö" to całkowicie poprawna nazwa pliku we wszystkich systemach, z których korzystam, więc możesz chcieć być nieco bardziej konkretny. Na przykład, na jakie dokładnie postacie chcesz (dis) pozwolić? –
@LaurenceGonsalves Może to być całkowicie poprawne, ale to nie znaczy, że przeżyje konkretny serwer sieciowy/przeglądarka internetowa/system operacyjny OS podczas pobierania. Kiedy pojawia się ten raport o błędzie, zwykle szybciej jest po prostu rozebrać akcenty, niż spróbować ustalić, gdzie leży problem. – millimoose
możliwy duplikat [Jaki jest najlepszy sposób na usunięcie akcentów w ciągu Pythona Unicode?] (Http://stackoverflow.com/questions/517923/what-is-the-best-way-to-remove-accents-in -a-python-unicode-string) – Johnsyweb