Seite 1 von 1
ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 11:17
von michi-monster
Ich habe auf einer Internetseite folgende Möglichkeit zum Suchen/Ersetzen gefunden:
Code: Alles auswählen
translation_table = {
"$": "€",
"?": "!",
"'": '"',
"[": None,
"]": None
}
teststring = """Das ist ein Test? Der kostet ['1000$']"""
print(teststring.translate(str.maketrans(translation_table)))
Ich lasse alles genauso ausser den Zeichen in der Tabelle:
Code: Alles auswählen
translation_table = {
"s": "M",
"sc": "fM",
"'": '"',
"[": None,
"]": None
}
teststring = """s soll in M geändert werden. Und sc in fM"""
print(teststring.translate(str.maketrans(translation_table)))
Wieso kommt der Fehler ? :
Code: Alles auswählen
Traceback (most recent call last):
File "/home/fridolin/PycharmProjects/suchen-ersetzen/translation-tabelle-1.py", line 10, in <module>
print(teststring.translate(str.maketrans(translation_table)))
ValueError: string keys in translate table must be of length 1
Process finished with exit code 1
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 11:45
von __deets__
Das haben wir vor über einem Monat mit dir doch schon durchdekliniert. Lies mal deinen alten Thread durch. Da hast du schon mal mit translate angefangen.
Und die Fehlermeldung ist auch SEHR eindeutig. Hast du mal versucht die nachzuvollziehen?
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 12:00
von michi-monster
Ich verstehe den Fehler nicht. Ich hatte das erst so interprtiert, dass nur ein Zeichen erlaubt ist. Also habe ich in der Übersetzungsliste Alles auf einen Buchstaben geändert.
Code: Alles auswählen
translation_table = {
"s": "M",
"c": "f",
"'": '"',
"[": None,
"]": None
}
teststring = """s soll in M geändert werden. Und sc in fM"""
print(teststring.translate(str.maketrans(translation_table)))
Das bringt aber nicht die Lösung. Bitte erläutert mir, was die Kiste will.
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 12:12
von __deets__
Das funktioniert doch. Zumindest wirft es keinen Fehler. Wo ist nun das Problem?
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 12:39
von michi-monster
Bei mir funzt es nicht. Werden bei einem Test bei Dir die Ersetzungen durchgeführt?
Code: Alles auswählen
fridolin@localhost ~/PycharmProjects/suchen-ersetzen $ less translation-tabelle-1.py
translation_table = {
"s": "M",
"c": "f",
"'": '"',
"[": None,
"]": None
}
fridolin@localhost ~/PycharmProjects/suchen-ersetzen $ python3 translation-tabelle-1.py
Traceback (most recent call last):
File "translation-tabelle-1.py", line 10, in <module>
print(teststring.translate(str.maketrans(translation_table)))
ValueError: string keys in translate table must be of length 1
EDIT: ich habe eine Anpassung unter Linux vorgenommen. Jetzt bekomme ich schonmal die Übersetzungen von einem Zeichen hin. Mit mehreren Zeichen werd ich noch recherchieren müssen ...
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 12:49
von __deets__
Nochmal: wir haben das mit dir schon alles besprochen. Nur weil jetzt 2018 ist, hat sich das nicht geändert. replace ist dein Freund, und wenn du das mehrfach brauchst, dann musst du es mehrfach aufrufen.
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 13:19
von snafu
michi-monster hat geschrieben:Jetzt bekomme ich schonmal die Übersetzungen von einem Zeichen hin. Mit mehreren Zeichen werd ich noch recherchieren müssen ...
Es geht nicht mit mehreren Zeichen. Das wäre zwar praktisch, ist aber für
translate() leider nicht so vorgesehen. Da hilft auch kein weiteres Recherchieren, sofern du nicht von
translate() abrücken willst.
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 14:08
von michi-monster
ok - vielen Dank. Ich habe jetzt ein wenig gesucht und geforscht in Sachen replace. Die Ausführung selbst ist erfolgreich. Leider habe ich noch keine Möglichkeit gefunden mehrere Ersetzungen in einer Klammer durchzuführen. Ist es überhaupt möglich? Sonst muss ich vielleicht ausführlicher nach Schleifen suchen. Da gibt es allerdings auch verschiedene Varianten. Wenn ihr mir nen Stichpunkt zu einer geeigneten gebt, würd ich mich freuen. Natürlich noch mehr, wenn ich das in str.replace einfügen kann
Code: Alles auswählen
str = "Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd chain. (16 sts)"
print(str.replace("3rd", "3."))
print(str.replace("stitch","Masche"))
print(str.replace("into each","in jede/n"))
print(str.replace("Round","Runde"))
print(str.replace("slst","LM"))
print(str.replace("Dc 2 into each stitch","Jede Masche verdoppeln"))
print(str.replace("sts","M"))
print(str.replace("chain","LM"))
/home/fridolin/PycharmProjects/suchen-ersetzen/venv/bin/python /home/fridolin/PycharmProjects/suchen-ersetzen/replace
Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3. chain. (16 sts)
Round 2: Ch 3. Dc 2 into each Masche. Join with a slst to the 3rd chain. (16 sts)
Round 2: Ch 3. Dc 2 in jede/n stitch. Join with a slst to the 3rd chain. (16 sts)
Runde 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd chain. (16 sts)
Round 2: Ch 3. Dc 2 into each stitch. Join with a LM to the 3rd chain. (16 sts)
Round 2: Ch 3. Jede Masche verdoppeln. Join with a slst to the 3rd chain. (16 sts)
Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd chain. (16 M)
Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd LM. (16 sts)
Process finished with exit code 0
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 14:34
von kbr
Mit replace kannst Du eine Zeichenfolge durch eine andere substituieren. Wenn Du dies mehrfach machen möchtest, musst Du replace mehrfach anwenden. Wie Du richtig erkannt hast, käme dafür eine Schleife infrage. Python kennt zwei Arten von Schleifen: for und while. Und jetzt kommt Deine Frage, anhand der Du was lernen kannst: welche solltest Du wählen und warum? Teste es doch einfach mal mit beiden aus, um herauszufinden, worin sie sich unterscheiden. Wenn Du eine definierte Anzahl von Ersetzungen hast, dann wirst Du erkennen, dass eine von beiden genau für solche Fälle konzipiert ist.
Re: ValueError: string keys in translate table must be of length 1
Verfasst: Sonntag 14. Januar 2018, 14:39
von snafu
Die Ersetzungen sollten sinnvollerweise in einer Schleife vorgenommen werden:
Code: Alles auswählen
def multi_replace(text, translations):
for original, replacement in translations:
text = text.replace(original, replacement)
return text
Dann kannst du die Übersetzungen z.B. in einer Liste von
(Original, Ersetzung)-Tupeln übergeben.
EDIT: Sorry @kbr