Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Stefan Behnel Newsgroups: de.comp.lang.python Subject: Re: [Python-de] python2 --> python3 : str vs bytes Date: Sun, 25 Aug 2019 10:44:02 +0200 Lines: 27 Message-ID: References: <07330df3-6eec-a92c-40c5-71634b718f33@behnel.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de 8tzmcol23VuPPXI8xhN18wPTQ9cVSX60zsghiINyNEKw== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1566723003; s=strato-dkim-0002; d=behnel.de; h=In-Reply-To:Date:Message-ID:From:References:To:Subject: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=6Ir1waAelQTxRcILR4o37mJbS2Zzwi5B5MKt3XVu+JU=; b=Cc5TDuxm9/JkVhgLDV2+Ks3tICewdNSUFZEBbiYcH9r+KIWauwQ3E6+auRJUAJ4FT3 rQQAYRMGYn3msZv40ROTRKn3I3VEzLEqj5Mt7xL8dBnWK42WR4kxOXPx9xerlY6wG5F6 kak4qi9GkW7el8+C+rOIfr0dN1Qdz3dhw2mAgca+xOnZWftSm2gA5xxMdjgBJwHUyD2U fTdODDtfLIYICcw4HZdoO0LQOjnYLqmSBWLnwcLHxEXUqaIHVJa7Cx5W2egQTfHYxroI HgA+I/jJt04ACiythC/drfOHVwEQgHgVpuuXvuxvBXR5minjMsJFO/S/Kwb/BmHnSFyo wtcQ== X-RZG-AUTH: ":E1MMdFW4b++AXZOTwA41DOYM0Dv9LNWvavC/fJZ6Wfgmp/Lh1ANWCRaaq2R1hCooD/t2Vl9QaFHh38sJGCJu0nqS0iI1gBy4Wj8LVlpcjbXQEUY=" X-RZG-CLASS-ID: mo00 Openpgp: preference=signencrypt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 In-Reply-To: Content-Language: de-DE X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <07330df3-6eec-a92c-40c5-71634b718f33@behnel.de> X-Mailman-Original-References: Xref: csiph.com de.comp.lang.python:5530 Ulli Horlacher schrieb am 25.08.19 um 10:00: > TypeError: sequence item 0: expected str instance, bytes found > > Wie macht mans besser? Grundregel: die Eingabedaten immer gleich beim Einlesen dekodieren und erst beim Ausgeben wieder kodieren, damit du innerhalb deines Programmes überall mit Unicode (sprich: Text) arbeiten kannst. Das Dekodieren erledigt Python (3) oft auch automatisch, z.B. wenn du von stdin oder aus einer UTF8-Textdatei (oder JSON/XML/...) liest. Alles andere musst du aber explizit einstellen, z.B. bei "open()" mit der "encoding=..." Option. Das Kodieren passiert z.B. beim Schreiben nach stdout (oder stderr) auch automatisch, in anderen Fällen musst du es aber explizit machen, insbesondere beim Schreiben in Dateien, denn Python kann nicht wissen, ob du die Datei in UTF-8 oder EBCDIC kodiert haben möchtest. In deinem Fall liegt das Problem also überhaupt nicht an der Stelle, an der du den Fehler bekommst, sondern irgendwo vorher, wo du Daten in Bytes einliest, ohne sie zu dekodieren. Python 3 macht den Programmfehler offensichtlich, den Python 2 früher so halbwegs unter den Teppich gekehrt hat (und der dadurch öfter mal nach Jahren noch zu unschönen Überraschungen geführt hat). Stefan