내가 가져 오는 많은 트윗에서 읽은이 문제가 있습니다.
b'I posted a new photo to Facebook'
나는 b
그것이 바이트 라는 것을 나타냅니다. 그러나 이것은 내가 작성하는 CSV 파일에서 b
사라지지 않고 향후 코드를 방해 하기 때문에 문제가 있음을 증명 합니다.
b
내 텍스트 줄 에서이 접두사 를 제거하는 간단한 방법이 있습니까?
utf-8로 인코딩 된 텍스트가 필요하거나 tweepy가 웹에서 텍스트를 가져 오는 데 문제가있는 것 같습니다.
분석중인 링크 콘텐츠는 다음과 같습니다.
https://www.dropbox.com/s/sjmsbuhrghj7abt/new_tweets.txt?dl=0
new_tweets = 'content in the link'
코드 시도
outtweets = [[tweet.text.encode("utf-8").decode("utf-8")] for tweet in new_tweets]
print(outtweets)
오류
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>
답변
당신은 할 필요가 디코딩bytes
당신의 문자열을 원하는 :
b = b'1234'
print(b.decode('utf-8')) # '1234'
답변
인쇄하는 객체가 문자열이 아니라 바이트 리터럴 로서의 바이트 객체라는 것을 알려주는 것 입니다. 사람들은 이것을 불완전한 방식으로 설명하므로 여기에 내 의견이 있습니다.
바이트 리터럴을 입력하고 (문자 그대로 바이트 객체를 사용하지 않고 예를 들어 b ”를 입력하여 바이트 객체를 정의) utf-8로 인코딩 된 문자열 객체 로 변환 하여 바이트 객체 를 생성하는 것을 고려하십시오 . (여기서 변환은 디코딩을 의미합니다. )
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
단순히 .decode(utf8)
함수 를 적용하는 것을 볼 수 있습니다 .
Python의 바이트
https://docs.python.org/3.3/library/stdtypes.html#bytes
문자열 리터럴은 다음 어휘 정의로 설명됩니다.
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>
답변
문자열로 변환하려면 디코딩해야합니다. python3의 바이트 리터럴에 대한 답변을 확인하십시오
.
In [1]: b'I posted a new photo to Facebook'.decode('utf-8')
Out[1]: 'I posted a new photo to Facebook'
답변
**** python에서 디코딩 된 문자열 인 b ”문자를 제거하는 방법 ****
import base64
a='cm9vdA=='
b=base64.b64decode(a).decode('utf-8')
print(b)
답변
django 2.0이있는 python 3.6에서 바이트 리터럴에 대한 디코딩이 예상대로 작동하지 않습니다. 예, 인쇄하면 올바른 결과를 얻지 만 올바르게 인쇄하더라도 b’value ‘는 여전히 있습니다.
이것이 바로 메신저 인코딩입니다.
uid': urlsafe_base64_encode(force_bytes(user.pk)),
이것이 바로 메신저 디코딩입니다.
uid = force_text(urlsafe_base64_decode(uidb64))
이것은 django 2.0이 말하는 것입니다.
urlsafe_base64_encode(s)[source]
URL에서 사용하기 위해 base64로 바이트 문자열을 인코딩하고 후행 등호를 제거합니다.
urlsafe_base64_decode(s)[source]
base64로 인코딩 된 문자열을 디코딩하여 제거되었을 수있는 후행 등호를 다시 추가합니다.
이것은 내 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 %}
이것은 내 콘솔 응답입니다.
콘텐츠 유형 : 텍스트 / 일반; charset = “utf-8″MIME- 버전 : 1.0 Content-Transfer-Encoding : 7bit 제목 : MySite 계정 활성화 보낸 사람 : webmaster @ localhost받는 사람 : testuser@yahoo.com 날짜 : 2018 년 4 월 20 일 금요일 06:26:46- 0000 메시지 ID : <152420560682.16725.4597194169307598579@Dash-U>
안녕하세요 testuser 님,
등록을 확인하려면 아래 링크를 클릭하십시오.
http://127.0.0.1:8000/activate/b'MjU'/4vi-fasdtRf2db2989413ba/
보시다시피 uid = b'MjU'
예상 uid = MjU
콘솔에서 테스트 :
$ 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
>>>
조사 후 파이썬 3과 관련된 것 같습니다. 내 해결 방법은 매우 간단했습니다.
'uid': user.pk,
활성화 기능에서 uidb64로 수신합니다.
user = User.objects.get(pk=uidb64)
그리고 짜잔 :
Content-Transfer-Encoding: 7bit
Subject: Activate Your MySite Account
From: webmaster@localhost
To: testuser@yahoo.com
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/
이제 잘 작동합니다. 🙂
답변
utf-8을 사용하여 출력 만 인코딩하여 완료했습니다. 다음은 코드 예제입니다.
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)
즉 : api에서 데이터를 수집 할 때 인코딩하지 말고 출력 (인쇄 또는 쓰기) 만 인코딩하십시오.
답변
다른 사람들이 여기에서 제안한 것처럼 즉시 다시 디코딩하고 싶지 않다고 가정하면 문자열로 구문 분석 한 다음 선행 'b
및 후행을 제거 할 수 있습니다 '
.
>>> 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"