Как мне избавиться от b-префикса в строке в python?

Связка твитов, которые я импортирую, имеет эту проблему, когда они читают

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>

Ответ 1

вам нужно decode bytes вам нужна строка:

b = b'1234'
print(b.decode('utf-8'))  # '1234'

Ответ 2

Это просто дает вам знать, что объект, который вы печатаете, не является строкой, а скорее байтовым объектом в виде байтового литерала. Люди объясняют это неполными способами, так что вот мой прием.

Рассмотрим создание байтового объекта путем ввода байтового литерала (буквально определяющего байтовый объект без фактического использования байтового объекта, например, путем ввода 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>

Ответ 3

Вам нужно декодировать его, чтобы преобразовать его в строку. Проверьте ответ здесь о байтах в python3.

In [1]: b'I posted a new photo to Facebook'.decode('utf-8')
Out[1]: 'I posted a new photo to Facebook'

Ответ 4

Я сделал это, только кодируя вывод с помощью 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)

i.e: не кодировать при сборе данных из api, кодировать вывод (только для печати или записи).

Ответ 5

На python 3.6 с django 2.0 декодирование в байтовом литерале работает не так, как ожидалось. Да, я получаю правильный результат, когда я его печатаю, но b'value 'все еще там, даже если вы напечатаете его правильно.

Это то, что im encoding

uid': urlsafe_base64_encode(force_bytes(user.pk)),

Это то, что им расшифровывается:

uid = force_text(urlsafe_base64_decode(uidb64))

Вот что говорит django 2.0:

urlsafe_base64_encode(s)[source]

Кодирует байтовую строку в base64 для использования в URL-адресах, снимая любые завершающие равные знаки.

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 %}

Это мой ответ консоли:

Content-Type: text/plain; charset = "utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Активируйте свою учетную запись MySite От: webmaster @localhost Кому: [email protected] Дата: Пт, 20 апр 2018 06:26:46 [ CN00] Идентификатор сообщения: <[email protected]>

Привет, 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
>>> 

После изучения это похоже на его отношение к python 3. Мое обходное решение было довольно простым:

'uid': user.pk,

Я получаю его как uidb64 для моей функции активации:

user = User.objects.get(pk=uidb64)

и вуаля:

Content-Transfer-Encoding: 7bit
Subject: Activate Your MySite Account
From: [email protected]
To: [email protected]
Date: Fri, 20 Apr 2018 20:44:46 -0000
Message-ID: <[email protected]>


Hi testuser,

Please click on the link below to confirm your registration:

http://127.0.0.1:8000/activate/45/4vi-3895fbb6b74016ad1882/

теперь он отлично работает. :)

Ответ 6

**** Как удалить b '' символы, которые декодируются в python ****

import base64
a='cm9vdA=='
b=base64.b64decode(a).decode('utf-8')
print(b)

Ответ 8

Хотя вопрос очень старый, я думаю, что может быть полезно, кто сталкивается с той же проблемой. Здесь тексты представляют собой строку, как показано ниже:

text= "b'I posted a new photo to Facebook'"

Таким образом, вы не можете удалить b, закодировав его, потому что это не байт. Я сделал следующее, чтобы удалить его.

cleaned_text = text.split("b'")[1]

который даст "I posted a new photo to Facebook"