u’\ufeff’ im Python-String

Lesezeit: 11 Minuten

Benutzer-Avatar
James Halle

Ich habe eine Fehlermeldung mit der folgenden Ausnahmemeldung erhalten:

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in
position 155: ordinal not in range(128)

Nicht sicher was u'\ufeff' Das heißt, es wird angezeigt, wenn ich Web Scraping mache. Wie kann ich Abhilfe schaffen? Das .replace() Die String-Methode funktioniert nicht.

  • Woher kommt dieser Input? Was versuchst du zu tun? Bitte geben Sie Ihren Python-Code an.

    Benutzer1907906

    28. Juli 2013 um 20:03 Uhr


  • Übrigens finde ich, dass .replace() in modernem Python funktioniert, wenn ich mich an den Unicode-Indikator erinnere: s.replace(u’\ufeff’,”)

    – Doug Bradshaw

    25. Juni 2016 um 13:23 Uhr


  • @DougBradshaw, wenn Sie “modernes Python” sagen, meinen Sie 2.7+ oder 3.0+?

    – teewuane

    2. März 2017 um 2:15 Uhr

  • Guter Punkt. Das heißt, 2,7+.

    – Doug Bradshaw

    24. Juli 2017 um 20:26 Uhr

Ich bin in Python 3 darauf gestoßen und habe diese Frage (und Lösung) gefunden. Beim Öffnen einer Datei unterstützt Python 3 das Schlüsselwort encoding, um die Codierung automatisch zu handhaben.

Ohne sie ist die Stückliste im Leseergebnis enthalten:

>>> f = open('file', mode="r")
>>> f.read()
'\ufefftest'

Bei korrekter Kodierung entfällt die BOM im Ergebnis:

>>> f = open('file', mode="r", encoding='utf-8-sig')
>>> f.read()
'test'

Nur meine 2 Cent.

  • Vielen Dank, dies ist die eigentliche Lösung und sollte die akzeptierte Antwort sein. Dies ist zwar ein großartiger Einblick, warum die Zeichenfolge vorhanden ist, aber die meisten Leute, die hierher kommen, suchen nach einer einfachen Lösung, und das ist es.

    – neurin

    12. Februar 2019 um 14:00 Uhr

  • Hatte das gleiche Problem mit dem CSV-DictReader, der eine aus Excel gespeicherte CSV-Datei liest.

    – Lukas

    4. Oktober 2019 um 14:01 Uhr

  • Ja, Excel (selbst „csv“, das von Excel generiert wird) ist wirklich ein heißes Durcheinander.

    – Fischadler

    22. Januar 2020 um 20:58 Uhr


  • Hat mir nicht geholfen, dieses Problem wirklich zu lösen. Wenn ich die Datei mit dieser Methode öffne, sehe ich immer noch die \ufeff.

    – Maschinenlerner

    17. Februar 2021 um 15:22 Uhr


  • Tut mir leid zu hören, dass @MachineLearner, utf-8-sig gerade für mich funktioniert hat (puh). Steht die Stückliste am Anfang Ihrer Akte? Ich frage mich, ob Sie einen Hexdump der Bytes bekommen können. In meinem Fall hexdump -n 16 -C (filename) produziert 00000000 ef bb bf 22 44 61 74 65 22 2c 22 54 69 6d 65 22 |..."Date","Time"|. Das ef bb bf ist die UTF-8-Kodierung von BOM.

    – Bob Stein

    17. Februar 2021 um 20:44 Uhr

Benutzer-Avatar
Markus Tolonen

Das Unicode-Zeichen U+FEFF ist die Byte-Order-Marke oder BOM und wird verwendet, um den Unterschied zwischen Big- und Little-Endian-UTF-16-Codierung zu erkennen. Wenn Sie die Webseite mit dem richtigen Codec decodieren, entfernt Python sie für Sie. Beispiele:

#!python2
#coding: utf8
u = u'ABC'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
print 'utf-8     %r' % e8
print 'utf-8-sig %r' % e8s
print 'utf-16    %r' % e16
print 'utf-16le  %r' % e16le
print 'utf-16be  %r' % e16be
print
print 'utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8')
print 'utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')
print 'utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16')
print 'utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le')

Beachten Sie, dass EF BB BF ist ein UTF-8-codiertes BOM. Es ist für UTF-8 nicht erforderlich, sondern dient nur als Signatur (normalerweise unter Windows).

Ausgabe:

utf-8     'ABC'
utf-8-sig '\xef\xbb\xbfABC'
utf-16    '\xff\xfeA\x00B\x00C\x00'    # Adds BOM and encodes using native processor endian-ness.
utf-16le  'A\x00B\x00C\x00'
utf-16be  '\x00A\x00B\x00C'

utf-8  w/ BOM decoded with utf-8     u'\ufeffABC'    # doesn't remove BOM if present.
utf-8  w/ BOM decoded with utf-8-sig u'ABC'          # removes BOM if present.
utf-16 w/ BOM decoded with utf-16    u'ABC'          # *requires* BOM to be present.
utf-16 w/ BOM decoded with utf-16le  u'\ufeffABC'    # doesn't remove BOM if present.

Notiere dass der utf-16 Codec erfordert BOM vorhanden sein, oder Python weiß nicht, ob die Daten Big- oder Little-Endian sind.

Dieser Charakter ist der Stückliste oder “Byte-Order-Mark”. Es wird normalerweise als die ersten paar Bytes einer Datei empfangen und sagt Ihnen, wie Sie die Codierung der restlichen Daten interpretieren müssen. Sie können den Charakter einfach entfernen, um fortzufahren. Obwohl der Fehler besagt, dass Sie versucht haben, in „ascii“ zu konvertieren, sollten Sie wahrscheinlich eine andere Codierung für das auswählen, was Sie versucht haben.

Benutzer-Avatar
Theodox

Der Inhalt, den Sie kratzen, ist in Unicode und nicht in ASCII-Text codiert, und Sie erhalten ein Zeichen, das nicht in ASCII konvertiert werden kann. Die richtige „Übersetzung“ hängt davon ab, was die ursprüngliche Webseite davon hielt. Pythons Unicode-Seite gibt den Hintergrund, wie es funktioniert.

Versuchen Sie, das Ergebnis zu drucken oder in eine Datei zu stecken? Der Fehler deutet darauf hin Schreiben die Daten, die das Problem verursachen, nicht lesen. Diese Frage ist ein guter Ort, um nach den Korrekturen zu suchen.

Benutzer-Avatar
caot

Hier basiert auf der Antwort von Mark Tolonen. Die Zeichenfolge enthielt verschiedene Sprachen des Wortes „test“, das durch „|“ getrennt ist, sodass Sie den Unterschied sehen können.

u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
print('utf-8     %r' % e8)
print('utf-8-sig %r' % e8s)
print('utf-16    %r' % e16)
print('utf-16le  %r' % e16le)
print('utf-16be  %r' % e16be)
print()
print('utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8'))
print('utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig'))
print('utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16'))
print('utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le'))

Hier ein Testlauf:

>>> u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> e8 = u.encode('utf-8')        # encode without BOM
>>> e8s = u.encode('utf-8-sig')   # encode with BOM
>>> e16 = u.encode('utf-16')      # encode with BOM
>>> e16le = u.encode('utf-16le')  # encode without BOM
>>> e16be = u.encode('utf-16be')  # encode without BOM
>>> print('utf-8     %r' % e8)
utf-8     b'ABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|'
>>> print('utf-8-sig %r' % e8s)
utf-8-sig b'\xef\xbb\xbfABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|'
>>> print('utf-16    %r' % e16)
utf-16    b"\xff\xfeA\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00"
>>> print('utf-16le  %r' % e16le)
utf-16le  b"A\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00"
>>> print('utf-16be  %r' % e16be)
utf-16be  b"\x00A\x00B\x00C\x00t\x00e\x00s\x00t\x03\xb2\x8c\x9dXT\xc7\x04\x00m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x06'\x06.\x06*\x06(\x06'\x061\x00|mK\x8b\xd5\x00|n,\x8af\x00|0\xc60\xb90\xc8\x00|\t*\t0\t@\t\x15\tM\t7\t>\x00|\r*\r0\r?\r6\rK\r'\r(\x00|\x05\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x00|\x00k\x00i\x1e\xc3\x00m\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|"
>>> print()

>>> print('utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8'))
utf-8  w/ BOM decoded with utf-8     '\ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig'))
utf-8  w/ BOM decoded with utf-8-sig 'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16'))
utf-16 w/ BOM decoded with utf-16    'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le'))
utf-16 w/ BOM decoded with utf-16le  '\ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'

Es lohnt sich zu wissen, dass nur beides utf-8-sig und utf-16 Holen Sie sich nach beiden die ursprüngliche Zeichenfolge zurück encode und decode.

Benutzer-Avatar
Jagdish Chauhan

Dieses Problem tritt grundsätzlich auf, wenn Sie Ihren Python-Code in a speichern UTF-8- oder UTF-16-Codierung weil Python am Anfang des Codes automatisch ein Sonderzeichen hinzufügt (das von den Texteditoren nicht angezeigt wird), um das Codierungsformat zu identifizieren. Aber wenn Sie versuchen, den Code auszuführen, erhalten Sie den Syntaxfehler in Zeile 1, dh Beginn des Codes, weil Der Python-Compiler versteht die ASCII-Codierung. wenn Sie den Code der Datei mit anzeigen lesen() Funktion, die Sie am Anfang des zurückgegebenen Codes sehen können ‘\ufeff’ wird gezeigt. Die einfachste Lösung für dieses Problem ist einfach vorbei Ändern der Kodierung zurück in ASCII-Kodierung(Dafür können Sie Ihren Code auf einen Notizblock kopieren und speichern. Denken Sie daran! Wählen Sie die ASCII-Codierung … Hoffe, das hilft.

1063110cookie-checku’\ufeff’ im Python-String

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy