Einige der Tweets, die ich importiere, haben dieses Problem, wo sie gelesen werden
b'I posted a new photo to Facebook'
Ich sammle die b
zeigt an, dass es ein Byte ist. Dies erweist sich jedoch als problematisch, da in meinen CSV-Dateien, die ich am Ende schreibe, die b
nicht verschwinden und den zukünftigen Code stören.
Gibt es eine einfache Möglichkeit, dieses b
Präfix aus meinen Textzeilen zu entfernen ?
Denken Sie daran, ich muss anscheinend den Text in utf-8 codieren lassen, oder Tweepy hat Probleme, sie aus dem Web zu ziehen.
Hier ist der Linkinhalt, den ich analysiere:
https://www.dropbox.com/s/sjmsbuhrghj7abt/new_tweets.txt?dl=0
new_tweets = 'content in the link'
Code-Versuch
outtweets = [[tweet.text.encode("utf-8").decode("utf-8")] for tweet in new_tweets]
print(outtweets)
Error
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-21-6019064596bf> in <module>()
1 for screen_name in user_list:
----> 2 get_all_tweets(screen_name,"instance file")
<ipython-input-19-e473b4771186> in get_all_tweets(screen_name, mode)
99 with open(os.path.join(save_location,'%s.instance' % screen_name), 'w') as f:
100 writer = csv.writer(f)
--> 101 writer.writerows(outtweets)
102 else:
103 with open(os.path.join(save_location,'%s.csv' % screen_name), 'w') as f:
C:\Users\Stan Shunpike\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final)
17 class IncrementalEncoder(codecs.IncrementalEncoder):
18 def encode(self, input, final=False):
---> 19 return codecs.charmap_encode(input,self.errors,encoding_table)[0]
20
21 class IncrementalDecoder(codecs.IncrementalDecoder):
UnicodeEncodeError: 'charmap' codec can't encode characters in position 64-65: character maps to <undefined>
Antworten:
Sie müssen die von Ihnen gewünschte Zeichenfolge dekodieren
bytes
:b = b'1234' print(b.decode('utf-8')) # '1234'
quelle
.encode("utf-8").decode("utf-8")
macht absolut nichts (wenn es überhaupt funktioniert) ... du bist auf Python 3, oder? py3 unterscheidet stark zwischenbytes
undstr
. Etwas in Ihrem Code scheint diecp1252
Codierung zu verwenden. Sie könnten versuchen, Ihre Datei mit zu öffnenopen(..., mode='w', encoding='utf-8')
und nurstr
in die Datei zu schreiben . oder Sie vergessen die gesamte Codierung und schreiben die Datei in Binärform:open(..., mode='wb')
(beachten Sie dieb
) und schreiben nurbytes
. Hilft das?"b'Due to the storms this weekend, we have rescheduled the Blumenfield Bike Ride for Feb 26. Hope to see you there.\xe2\x80\xa6'"
.encode("utf-8").decode("utf-8")
dass ich irgendetwas tun würde, aber die Leute hier schienen zu denken, dass dies die richtige Antwort war, was nicht so weit ist, wie ich sehen kann.C:\Users\Stan Shunpike\Anaconda3\lib\encodings\cp1252.py
. Sie sollten wahrscheinlich versuchen herauszufinden, wie / wo das verwendet wird. oh, und du benutzt dascsv.writer
; In diesem Fall müssen Sie in derstr
Tat ein Nicht schreibenbytes
. Bekommst du Dinge vonrequests
? Die Codierung, die Sie von einer Webressource erhalten, kann von abweichenutf-8
.Es soll Sie nur wissen lassen, dass das Objekt, das Sie drucken, keine Zeichenfolge ist, sondern ein Byte-Objekt als Byte-Literal . Die Leute erklären dies auf unvollständige Weise, also hier ist meine Meinung.
Erstellen Sie ein Byte-Objekt, indem Sie ein Byte-Literal eingeben (ein Byte-Objekt buchstäblich definieren, ohne tatsächlich ein Byte-Objekt zu verwenden, z. B. durch Eingabe von b '') und es in ein in utf-8 codiertes Zeichenfolgenobjekt konvertieren . (Beachten Sie, dass Konvertieren hier Dekodieren bedeutet )
byte_object= b"test" # byte object by literally typing characters print(byte_object) # Prints b'test' print(byte_object.decode('utf8')) # Prints "test" without quotations
Sie sehen, dass wir die
.decode(utf8)
Funktion einfach anwenden .Bytes in Python
https://docs.python.org/3.3/library/stdtypes.html#bytes
String-Literale werden durch die folgenden lexikalischen Definitionen beschrieben:
https://docs.python.org/3.3/reference/lexical_analysis.html#string-and-bytes-literals
stringliteral ::= [stringprefix](shortstring | longstring) stringprefix ::= "r" | "u" | "R" | "U" shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"' longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""' shortstringitem ::= shortstringchar | stringescapeseq longstringitem ::= longstringchar | stringescapeseq shortstringchar ::= <any source character except "\" or newline or the quote> longstringchar ::= <any source character except "\"> stringescapeseq ::= "\" <any source character> bytesliteral ::= bytesprefix(shortbytes | longbytes) bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"' longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""' shortbytesitem ::= shortbyteschar | bytesescapeseq longbytesitem ::= longbyteschar | bytesescapeseq shortbyteschar ::= <any ASCII character except "\" or newline or the quote> longbyteschar ::= <any ASCII character except "\"> bytesescapeseq ::= "\" <any ASCII character>
quelle
Sie müssen es dekodieren, um es in eine Zeichenfolge zu konvertieren. Überprüfen Sie hier die Antwort zum Byte-Literal in Python3 .
In [1]: b'I posted a new photo to Facebook'.decode('utf-8') Out[1]: 'I posted a new photo to Facebook'
quelle
encode("utf-8")
, Fehler bekomme. Und, wie ich hier erwähnte, hat das Entfernen von stackoverflow.com/q/41915383/4422095 das Problem nicht gelöst. Selbst wenn ich die Dekodierung wie vorgeschlagen verwende, wird immer noch eine Fehlermeldung angezeigt. Ich werde das in der Post posten.utf-8
war ein Beispiel.**** So entfernen Sie b '' Zeichen, die als Zeichenfolge in Python dekodiert sind ****
import base64 a='cm9vdA==' b=base64.b64decode(a).decode('utf-8') print(b)
quelle
Unter Python 3.6 mit Django 2.0 funktioniert die Dekodierung in einem Byte-Literal nicht wie erwartet. Ja, ich bekomme das richtige Ergebnis, wenn ich es drucke, aber der b'-Wert ist immer noch da, selbst wenn Sie es richtig drucken.
Dies ist, was ich codiere
uid': urlsafe_base64_encode(force_bytes(user.pk)),
Dies ist, was ich dekodiere:
Dies ist, was Django 2.0 sagt:
Codiert einen Bytestring in base64 zur Verwendung in URLs, wobei alle nachfolgenden Gleichheitszeichen entfernt werden.
Dekodiert eine Base64-codierte Zeichenfolge und fügt alle nachfolgenden Gleichheitszeichen zurück, die möglicherweise entfernt wurden.
Dies ist meine Datei account_activation_email_test.html
{% autoescape off %} Hi {{ user.username }}, Please click on the link below to confirm your registration: http://{{ domain }}{% url 'accounts:activate' uidb64=uid token=token %} {% endautoescape %}
Dies ist meine Konsolenantwort:
Inhaltstyp: Text / Klartext; charset = "utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Betreff: Aktivieren Sie Ihr MySite-Konto Von: webmaster @ localhost An: [email protected] Datum: Fr, 20 Apr 2018 06:26:46 - 0000 Nachrichten-ID: <152420560682.16725.4597194169307598579@Dash-U>
Hallo Testbenutzer,
Bitte klicken Sie auf den Link unten, um Ihre Registrierung zu bestätigen:
http://127.0.0.1:8000/activate/b'MjU'/4vi-fasdtRf2db2989413ba/
Wie du siehst
uid = b'MjU'
erwartet
uid = MjU
Test in der Konsole:
$ python Python 3.6.4 (default, Apr 7 2018, 00:45:33) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode >>> from django.utils.encoding import force_bytes, force_text >>> var1=urlsafe_base64_encode(force_bytes(3)) >>> print(var1) b'Mw' >>> print(var1.decode()) Mw >>>
Nach der Untersuchung scheint es mit Python 3 zu tun zu haben. Meine Problemumgehung war recht einfach:
'uid': user.pk,
Ich erhalte es als uidb64 auf meiner Aktivierungsfunktion:
und voila:
Content-Transfer-Encoding: 7bit Subject: Activate Your MySite Account From: webmaster@localhost To: [email protected] Date: Fri, 20 Apr 2018 20:44:46 -0000 Message-ID: <152425708646.11228.13738465662759110946@Dash-U> Hi testuser, Please click on the link below to confirm your registration: http://127.0.0.1:8000/activate/45/4vi-3895fbb6b74016ad1882/
jetzt funktioniert es gut. :) :)
quelle
Ich habe es geschafft, indem ich nur die Ausgabe mit utf-8 codiert habe. Hier ist das Codebeispiel
new_tweets = api.GetUserTimeline(screen_name = user,count=200) result = new_tweets[0] try: text = result.text except: text = '' with open(file_name, 'a', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(text)
dh: beim Sammeln von Daten aus der API nicht codieren, sondern nur die Ausgabe (Drucken oder Schreiben) codieren.
quelle
Angenommen, Sie möchten es nicht sofort wieder dekodieren, wie andere es hier vorschlagen, können Sie es zu einer Zeichenfolge analysieren und dann nur die führenden
'b
und nachfolgenden Zeichenfolgen entfernen'
.>>> x = "Hi there 😄" >>> x = "Hi there 😄".encode("utf-8") >>> x b"Hi there \xef\xbf\xbd" >>> str(x)[2:-1] "Hi there \\xef\\xbf\\xbd"
quelle
Obwohl die Frage sehr alt ist, denke ich, dass es hilfreich sein kann, wer vor dem gleichen Problem steht. Hier ist der Text eine Zeichenfolge wie folgt:
text= "b'I posted a new photo to Facebook'"
Daher können Sie b nicht durch Codierung entfernen, da es kein Byte ist. Ich habe Folgendes getan, um es zu entfernen.
cleaned_text = text.split("b'")[1]
was geben wird
"I posted a new photo to Facebook"
quelle
"I posted a new photo to Facebook'"
. Darum geht es in der Frage sowieso nicht.