Encoding Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Guten Abend,

ich habe folgendes Problem.
Von meinem MediaServer bekomme ich die Titel (im Format wie bei mystring) der Videos als XML geliefert.
Einer der Titel (Die Erlösung) enthält das ö und das macht Probleme.

Im Beispiel liefern alle Codecs, die zur Verfügung stehen,
entweder einen Fehler ala 'ascii' codec can't decode byte 0xc3 in position 7: ordinal not in range(128) oder charmap ...
oder Die Erl├Âsung als Ausgabe.

Code: Alles auswählen

# -*- encoding: utf-8 -*-

mystring='\x44\x69\x65\x20\x45\x72\x6C\xC3\xB6\x73\x75\x6E\x67'
print mystring
for enc in ['ascii','big5','big5hkscs','cp037','cp424',
            'cp437','cp500','cp720','cp737','cp775','cp850',
            'cp852','cp855','cp856','cp857','cp858','cp860',
            'cp861','cp862','cp863','cp864','cp865','cp866',
            'cp869','cp874','cp875','cp932','cp949','cp950',
            'cp1006','cp1026','cp1140','cp1250','cp1251',
            'cp1252','cp1253','cp1254','cp1255','cp1256',
            'cp1257','cp1258','euc_jp','euc_jis_2004',
            'euc_jisx0213','euc_kr','gb2312','gbk','gb18030',
            'hz','iso2022_jp','iso2022_jp_1','iso2022_jp_2',
            'iso2022_jp_2004','iso2022_jp_3','iso2022_jp_ext',
            'iso2022_kr','latin_1','iso8859_2','iso8859_3',
            'iso8859_4','iso8859_5','iso8859_6','iso8859_7',
            'iso8859_8','iso8859_9','iso8859_10','iso8859_13',
            'iso8859_14','iso8859_15','iso8859_16','johab',
            'koi8_r','koi8_u','mac_cyrillic','mac_greek',
            'mac_iceland','mac_latin2','mac_roman','mac_turkish',
            'ptcp154','shift_jis','shift_jis_2004','shift_jisx0213',
            'utf_32','utf_32_be','utf_32_le','utf_16','utf_16_be',
            'utf_16_le','utf_7','utf_8','utf_8_sig','utf-8']:
    
    try:
        #print '{0} = {1}'.format(enc, mystring.encode(enc))                    # alle melden Fehler
        #print '{0} = {1}'.format(enc, unicode(mystring,enc))                    # alle melden Fehler
        #print '{0} = {1}'.format(enc, unicode(mystring).encode(enc))        # alle melden Fehler
        print '{0} = {1}'.format(enc, unicode(mystring,enc).encode(enc))    # ein paar funktionieren z.B. latin_1 aber immer nur Die Erl├Âsung
    except Exception, e:
        print '{0} = ERROR :: {1}'.format(enc,e)

Wie kann ich aus mystring nach "Die Erlösung" konvertieren?

Vielen lieben Dank
Claudia
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du musst das Encoding kennen, in dem Deine Daten geliefert werden! Punkt.

Andererseits ist das bei (validem) XML einfach: Entweder ist es UTF-8 - per default - oder es *muss* ein ``encoding``-Attribut in der XML-Deklaration vorhanden sein.

Die verstümmelte Ausgabe kann übrigens auch davon herrühren, wenn Deine Shell das Ausgabe-Encoding *nicht* unterstützt.

Edit: Bei mir mit Python 3.4 und einer Shell, die UTF-8 unterstützt sieht es ganz danach aus, als sei es auch UTF-8 codiert:

Code: Alles auswählen

# Im Unterschied zu Python 2.x sind codierte Strings in Python 3.x bytes
mybytes = b'\x44\x69\x65\x20\x45\x72\x6C\xC3\xB6\x73\x75\x6E\x67'

# Zu einem (Unicode-)String kommt man, indem man aus einem 
# codierten Bytestring mit Angabe der passenden Kodierung dekodiert:
print(mybytes.decode("utf-8"))
> 'Die Erlösung'
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@myxin: Um's noch mal deutlich zu wiederholen: Wenn das XML ist, dann kümmert sich der XML-Parser den Du verwendest, schon darum es zu dekodieren.
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Hallo Hyperion und BlackJack,

vielen Dank für Eure Antworten.

@Hyperion, ja, Du hat Recht es ist UTF-8.

@Hyperion und BlackJack
Folgendes mache ich auf Windows mit Python 2.7
via httplib.HTTPConnection den Request schicken und die Repsonse
in einer Variablen vom <type 'str'> speichern.
Diese übergebe ich dann xml.etree.ElementTree.fromstring
und iteriere über das Element bis ich das Result Tag bekomme.
Da bekomme ich dann das Problem. Ich möchte mit
itertext das Result Tag iterieren bekomme aber den
Fehler UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' ...
Deshalb meine Versuche mit den diversen Codecs. UTF-8 ist auch einer derjenigen,
die "teilweise" funktionieren aber ich habe bis dato keinen Weg, welcher mir
das ö ausgibt.

Danke
Claudia
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wenn Du über HTTP etwas holen möchtest, sei Dir das Modul Requests ans Herz gelegt. Das hat ein klasse API :-)

Was für Daten holst Du Dir denn? Ist das XML oder doch HTML? Und steht da ein Encoding-Tag drin? (Bei HTML ist das afaik auch Sitte anzugeben) Je nach dem, was es denn nun ist, kannst Du auch nicht einfach so einen XML-Parser nutzen, sondern müsstest eben ggf. einen HTML-Parser nutzen.

Der Fehler klingt komisch! Dabei geht's ja ums Encoding, also dem Konvertieren von Unicode in codierte Strings. Versuchst Du da etwa irgend wo einen Unicode-String zu printen? Das muss ja schief gehen, da Python 2 iirc ASCII als Default-Encoding ansieht und das umfasst ja eben keine deutschen Umlaute. Sprich, wenn man einen Unicode-String mittels print ausgeben will, so *muss* Python intern diesen String implizit kodieren und nutzt dafür eben ``ascii``.

Wenn ich da richtig vermute, so musst Du den Unicode-String vor dem printen *encodieren*, und zwar am besten mit einem Encoding, mit dem Deine Shell auch klar kommt :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

OK - jetzt glaube ich hab ich es verstanden.
Bei Windows, oder wenigstens bei mir ist das encoding in der Shell cp850.
Wenn ich also

Code: Alles auswählen

mystring.decode('utf-8').encode('cp850)'
mache, dann bekomme ich das ö.

Danke
Claudia
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Hyperion hat geschrieben:Wenn Du über HTTP etwas holen möchtest, sei Dir das Modul Requests ans Herz gelegt. Das hat ein klasse API :-)

Was für Daten holst Du Dir denn? Ist das XML oder doch HTML? Und steht da ein Encoding-Tag drin? (Bei HTML ist das afaik auch Sitte anzugeben) Je nach dem, was es denn nun ist, kannst Du auch nicht einfach so einen XML-Parser nutzen, sondern müsstest eben ggf. einen HTML-Parser nutzen.

Der Fehler klingt komisch! Dabei geht's ja ums Encoding, also dem Konvertieren von Unicode in codierte Strings. Versuchst Du da etwa irgend wo einen Unicode-String zu printen? Das muss ja schief gehen, da Python 2 iirc ASCII als Default-Encoding ansieht und das umfasst ja eben keine deutschen Umlaute. Sprich, wenn man einen Unicode-String mittels print ausgeben will, so *muss* Python intern diesen String implizit kodieren und nutzt dafür eben ``ascii``.

Wenn ich da richtig vermute, so musst Du den Unicode-String vor dem printen *encodieren*, und zwar am besten mit einem Encoding, mit dem Deine Shell auch klar kommt :-)
ooppss, das hatte ich jetzt übersehen.
Melde mich gleich nochmal

Ich habe noch mal den Wiresharktrace angeschaut und ja, es ist ein HTML Response.
Wenn ich dann aber mit der ResponseObjekt Methode read die
Antwort lese, dann ist das nur noch ein XML String, denn ich jetzt noch "printen" kann.

Gekürzte Version (das erste item habe ich behalten, die anderen 139 sind ausgeschnitten)

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:BrowseResponse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
<Result><DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/">
<item id="0_0_90" parentID="0_0" restricted="1">
<res protocolInfo="http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000" duration="02:05:00" protection="0" size="5790929408">http://192.168.0.3:49154/files/0_0_90</res>
<dc:title>2 Fast 2 Furious (2014-01-26)</dc:title>
<dc:date>2014-01-26T12:30:00</dc:date>
<upnp:lastPlaybackPosition>0</upnp:lastPlaybackPosition><upnp:class>object.item.videoItem</upnp:class>
</item>

...

</DIDL-Lite></Result>
<NumberReturned>140</NumberReturned>
<TotalMatches>140</TotalMatches>
<UpdateID>0</UpdateID>
</u:BrowseResponse>
</s:Body> </s:Envelope>

Diesen String übergebe ich nun xml.etree.ElementTree.fromstring und iteriere dann über die
TAGs bis ich beim itertext den Fehler bekomme, welche ich nun mit einem zusätzlichen target
Objekt und der decode('utf-8').encode('cp850') gelöst habe. Weiß nicht ob das wirklich
schön ist, aber es funktioniert.

Claudia
Zuletzt geändert von myxin am Dienstag 19. August 2014, 22:21, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

myxin hat geschrieben:Bei Windows, oder wenigstens bei mir ist das encoding in der Shell cp850.
Bei mir auch. In der IDE ist es allerdings UTF-8. Die programmtechnische Ermittlung via sys.stdout.encoding hilft da sehr bei der Flexibilisierung.
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

/me hat geschrieben:
myxin hat geschrieben:Bei Windows, oder wenigstens bei mir ist das encoding in der Shell cp850.
Bei mir auch. In der IDE ist es allerdings UTF-8. Die programmtechnische Ermittlung via sys.stdout.encoding hilft da sehr bei der Flexibilisierung.
Hallo /me,

sys.stdout.encoding hat mich auch ein bisschen "geärgert", obwohl ich jetzt weiß
dass es nichts dafür konnte sondern das nppexec plugin von notepad++.
Beim testen wurde mir nämlich immer None zurückgeliefert bis ich im normalen cmd Fenster
cp850 erkannte, aber ja, dass ist der Weg um das zu ermitteln.

Merci
Claudia
BlackJack

`sys.stdout.encoding` ist nicht *der* Weg sondern nur ein Teil, denn es kann ja auch `None` sein. Das ist es zum Beispiel wenn man die Ausgabe in eine Datei umleitet, oder wenn die Ausgabe nicht auf ein Terminal sondern über eine Pipe zu einem anderen Prozess geht. Es ist also ganz normal dass das auch `None` sein kann, und damit sollte man dann auch umgehen können. Was letztendlich bedeutet man nimmt in solchen Fällen eine feste Kodierung, und oder man erlaubt dem Benutzer die Kodierung als Option anzugeben.
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

BlackJack hat geschrieben:`sys.stdout.encoding` ist nicht *der* Weg sondern nur ein Teil, denn es kann ja auch `None` sein. Das ist es zum Beispiel wenn man die Ausgabe in eine Datei umleitet, oder wenn die Ausgabe nicht auf ein Terminal sondern über eine Pipe zu einem anderen Prozess geht. Es ist also ganz normal dass das auch `None` sein kann, und damit sollte man dann auch umgehen können. Was letztendlich bedeutet man nimmt in solchen Fällen eine feste Kodierung, und oder man erlaubt dem Benutzer die Kodierung als Option anzugeben.
Hallo BlackJack,

kam anscheinend falsch rüber, das meinte ich, bin absolut deiner Meinung.

Merci

Claudia
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ein XML-Parser gibt einem übrigens normalerweise Unicode zurück - es sei denn, die Werte liegen an sich nur im ASCII-Bereich; dann optimieren da einige und reichen einem einen ASCII-Byte-String zurück (``lxml`` habe ich da irgend wie in Erinnerung und wir reden hier nur von Python 2.x). Kurz um, das ``.decode("utf-8")`` sollte unnötig sein und nur das ``encode`` spielt dann eben für die Ausgabe eine Rolle.

Da Du offenkundig einen SOAP-Webservice ansprichst, kommt da wohl auch kein HTML zurück - denn SOAP nutzt XML. Mich wundert allerdings, dass dabei die XML-Deklarationen nicht mitgesendet wird... nun ja, geht natürlich auch ohne.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Hyperion hat geschrieben:Ein XML-Parser gibt einem übrigens normalerweise Unicode zurück - es sei denn, die Werte liegen an sich nur im ASCII-Bereich; dann optimieren da einige und reichen einem einen ASCII-Byte-String zurück (``lxml`` habe ich da irgend wie in Erinnerung und wir reden hier nur von Python 2.x). Kurz um, das ``.decode("utf-8")`` sollte unnötig sein und nur das ``encode`` spielt dann eben für die Ausgabe eine Rolle.

Da Du offenkundig einen SOAP-Webservice ansprichst, kommt da wohl auch kein HTML zurück - denn SOAP nutzt XML. Mich wundert allerdings, dass dabei die XML-Deklarationen nicht mitgesendet wird... nun ja, geht natürlich auch ohne.
Also auf Protokollebene ist es wohl HTML und XML eingebettet.
Ob es sich um einen SOAP Service handelt, weiß ich nicht - leider gibt es dazu von meinem TV Hersteller keine Information.

<Ausschnitt aus wireshark>

HTTP/1.1 200 OK
CONTENT-LENGTH: 91041
CONTENT-TYPE: text/xml; charset="utf-8"
DATE: Sun, 17 Aug 2014 22:02:22 GMT
EXT:
SERVER: Linux/2.6.18.5, DLNADOC/1.50 UPnP/1.0, Portable SDK for UPnP devices/1.6.18
X-User-Agent: redsonic

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:BrowseResponse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
<Result> ...

</Ausschnitt aus wireshark>

So wie ich es jetzt habe

Code: Alles auswählen

for item in element.iter():

    try:
        if item.tag == '{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}item':
            if res != 'not set':
                
                filename = title.encode('utf-8') + date
                for c in ' <>:"/\|?*':
                    if c in filename:
                        filename = filename.replace(c, '_')

                print 'Saving file {0} as R:/{0}.raw'.format(filename.decode('utf-8').encode('cp850'))
                urllib.urlretrieve(res, 'R:/{0}.raw'.format(filename))
                print 'done'
                
                res = 'not set'
                title = 'not set'
                date = 'not set'
                lastPlaybackPosition = 'not set'
        else:
            if item.tag == '{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}res':
                res = item.text
            if item.tag == '{http://purl.org/dc/elements/1.1/}title':
                 title = item.text
            if item.tag == '{http://purl.org/dc/elements/1.1/}date':
                date = item.text
            if item.tag == '{urn:schemas-upnp-org:metadata-1-0/upnp/}lastPlaybackPosition':
                lastPlaybackPosition = item.text
    except UnicodeEncodeError, e:
        print 'ERROR:{0}'.format(e)
        res = 'not set'
        title = 'not set'
        date = 'not set'
        lastPlaybackPosition = 'not set'
funktioniert es und ich bekomme "Die Erlösung".

Also nochmals vielen vielen Dank
und gute Nacht :D

Claudia
BlackJack

Der kleine Zustandsautomat den Du Dir da gebastelt hast ist irgendwie nicht so schön. Ausserdem, zumindest wenn das alles ist, dann ist der fehlerhaft, weil Du immer bei einem neuen `item`-Tag die Werte des letzten ausgibst/herunterlädtst. Das würde aber bedeuten dass der letzte nicht verarbeitet wird, weil da keiner mehr danach kommt um die Verarbeitung anzustossen. Man würde hier besser alle <item>-Elemente per `findall()` oder `iterfind()` suchen und darüber iterieren. Die Informationen innerhalb des <item> würde ich wohl auch eher mit `find()` abfragen, statt der vielen ``if``-Abfragen.

Diese hin- und her-kodiererei ist auch sehr merkwürdig. Gerde Windows sollte doch mit Unicode als Dateinamen problemlos klar kommen. Die Ausnahmebehandlung ist ungünstig. Probleme würde ich hier bei der Ausgabe mit ``print`` erwarten, aber nur weil man das nicht ausgeben kann, sollte man doch nicht das herunterladen sein lassen.

Das Ersetzen von besonderen Zeichen im Dateinamen geht einfacher. Der ``if``-Test ist überflüssig, da kann man auch gleich `replace()` aufrufen. Denn wenn das Zeichen nicht enthalten ist, dann macht `replace()` auch nichts. Ansonsten könnte man hier auch die `translate()`-Methode verwenden und `string.maketrans()` oder das `re`-Modul bemühen. Ich würde das auch in eine eigene Funktion auslagern. Man könnte das grundsätzlich mal ein bisschen aufteilen. Zum Beispiel das extrahieren der Daten, die Ausgaben, und das herunterladen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

myxin hat geschrieben: Also auf Protokollebene ist es wohl HTML und XML eingebettet.
Nee, es handelt sich um HTTP, nicht HTML ;-) Und da ist sogar ein Encoding mit angegeben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Mal ein Ansatz das alles ein wenig besser zu trennen (ungetestet):

Code: Alles auswählen

from __future__ import print_function
import os
import re
import sys
import urllib
from functools import partial

STDOUT_ENCODING = sys.stdout.encoding or 'utf8'
ITEM_TAG = '{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}item'
ITEM_KEY_TO_TAG_NAME = {
    'date': '{http://purl.org/dc/elements/1.1/}date',
    'last_playback_position':
        '{urn:schemas-upnp-org:metadata-1-0/upnp/}lastPlaybackPosition',
    'resource': '{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}res',
    'title': '{http://purl.org/dc/elements/1.1/}title',
}


clean_filename = partial(re.sub, re.escape(' <>:"/\|?*'), '_')


def get_text(node, tag, default='not set'):
    result_node = node.find(tag)
    return default if result_node is None else result_node.text


def iter_items(document):
    for item in document.findall(ITEM_TAG):
        yield dict(
            (key, get_text(item, tag_name))
            for key, tag_name in ITEM_KEY_TO_TAG_NAME
        )


def main():
    document = ...

    for item in iter_items(document):
        filename = os.path.join(
            'R:', clean_filename(item['title'] + item['date']) + '.raw'
        )
        print(u'Saving {0!r}'.format(filename).encode(STDOUT_ENCODING))
        urllib.urlretrieve(item['resource'], filename)
        print('done')


if __name__ == '__main__':
    main()
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Hyperion hat geschrieben:
myxin hat geschrieben: Also auf Protokollebene ist es wohl HTML und XML eingebettet.
Nee, es handelt sich um HTTP, nicht HTML ;-) Und da ist sogar ein Encoding mit angegeben.
Aahhhh, natürlich ... :oops: ... pssst - bitte nicht weitersagen :wink:

Claudia
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

BlackJack hat geschrieben:Mal ein Ansatz das alles ein wenig besser zu trennen (ungetestet):

Code: Alles auswählen

from __future__ import print_function
import os
import re
import sys
import urllib
from functools import partial

STDOUT_ENCODING = sys.stdout.encoding or 'utf8'
ITEM_TAG = '{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}item'
ITEM_KEY_TO_TAG_NAME = {
    'date': '{http://purl.org/dc/elements/1.1/}date',
    'last_playback_position':
        '{urn:schemas-upnp-org:metadata-1-0/upnp/}lastPlaybackPosition',
    'resource': '{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}res',
    'title': '{http://purl.org/dc/elements/1.1/}title',
}


clean_filename = partial(re.sub, re.escape(' <>:"/\|?*'), '_')


def get_text(node, tag, default='not set'):
    result_node = node.find(tag)
    return default if result_node is None else result_node.text


def iter_items(document):
    for item in document.findall(ITEM_TAG):
        yield dict(
            (key, get_text(item, tag_name))
            for key, tag_name in ITEM_KEY_TO_TAG_NAME
        )


def main():
    document = ...

    for item in iter_items(document):
        filename = os.path.join(
            'R:', clean_filename(item['title'] + item['date']) + '.raw'
        )
        print(u'Saving {0!r}'.format(filename).encode(STDOUT_ENCODING))
        urllib.urlretrieve(item['resource'], filename)
        print('done')


if __name__ == '__main__':
    main()
Ja, das sieht viel professioneller aus und ja, da ist was wahres dran,
das letzte Item geht mir durch die Lappen gehen.
Das mit dem printen und downloaden, habe ich nur zum testen.
Am Schluß soll es automatisiert ablaufen.

Vielen Dank für die ganze Arbeit.

Claudia
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Claudia: Versuche mal, nicht bei jeder Antwort einen Full-Quote zu machen; das erschwert die Übersicht im Thread. Zitiere einfach nur die Passage, auf die Du Dich beziehst :-) (Oder schreib nur "@Name", wenn Du Dich allgemein auf ein komplettes Posting beziehst)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

BlackJack hat geschrieben: ...
clean_filename = partial(re.sub, re.escape(' <>:"/\|?*'), '_')
...
[/code]
OK, erste Verständnisfrage ;-)

partial, laut Doku

The partial() is used for partial function application which “freezes” some portion of a function’s arguments and/or keywords resulting in a new object with a simplified signature.

heisst was? Ich baue mir also ein Funktion als Einzeiler? Ist dem lamda ähnlich?
Wäre dies auch eine Möglichkeit eine Funktion als C Parameter zu übergeben?
Oldstyle wäre eine Funktion clean_filename in welcher ich
dann mit regulären Ausdrücken die invaliden Zeichen ersetze und das Ergebnis
zurückgebe, oder übersehe ich etwas Fundamentales?

@Hyperion - gelobe Besserung

Merci
Claudia
Antworten