मैं अजगर में एक स्ट्रिंग में बी-उपसर्ग से छुटकारा कैसे प्राप्त करूं?


87

मेरे द्वारा आयात किए जा रहे ट्वीट्स का एक गुच्छा इस मुद्दे पर है कि वे कहां पढ़ते हैं

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>

क्या आप पाठ की उन पंक्तियों का कम से कम हिस्सा दिखा सकते हैं ?
— रोमनपेरेक्रेस्ट

@RomanPerekhrest मुझे खेद है, आप इससे अधिक क्या चाहेंगे? कोड या आउटपुट?
— स्टेन शुनपाइक

फ़ाइलें खोलते समय हमेशा एन्कोडिंग निर्दिष्ट करें।
— एमकेस्पर

जवाबों:


136

आप एक स्ट्रिंग चाहते हैं आप को डिकोड करने bytesकी आवश्यकता है :

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

मैंने सवाल अपडेट किया है। मुझे नहीं लगता कि यह विधि काम करती है। यदि ऐसा होता है, तो आप विस्तृत क्यों कर सकते हैं?
— स्टेन शुनपाइक

4
.encode("utf-8").decode("utf-8")बिल्कुल कुछ नहीं करता है (यदि यह बिल्कुल काम करता है) ... आप अजगर 3 पर हैं, है ना? py3 के बीच एक मजबूत अंतर है bytesऔर str। आपके कोड में कुछ cp1252एन्कोडिंग का उपयोग करने के लिए लगता है ... आप अपनी फ़ाइल को खोलने का प्रयास कर सकते हैं open(..., mode='w', encoding='utf-8')और केवल strफ़ाइल पर लिख सकते हैं ; या आप सभी एन्कोडिंग के बारे में भूल जाते हैं और फाइल को बाइनरी में लिखते हैं: open(..., mode='wb')(नोट करें b) और केवल लिखें bytes। क्या उससे मदद हुई?
— हीरो पात्र

नहीं, यह ठीक नहीं है। मुझे मिल गया"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'"
— स्टेन शुनपाइक

आप इसे cp1252 के रूप में कैसे बता सकते हैं? मैंने यह भी नहीं सोचा था कि .encode("utf-8").decode("utf-8")कुछ भी करूंगा, लेकिन यहां के लोगों को लगता है कि यह सही जवाब था, जो अब तक ऐसा नहीं है जैसा कि मैं देख सकता हूं।
— स्टेन शुनपाइक

मैं ट्रेसबैक में इस रास्ते को देखा C:\Users\Stan Shunpike\Anaconda3\lib\encodings\cp1252.py:। आपको शायद यह पता लगाने की कोशिश करनी चाहिए कि इसका उपयोग कैसे / कहाँ किया जाता है। ओह, और आप उपयोग कर रहे हैं csv.writer; उस स्थिति में आपको strवास्तव में लिखने की आवश्यकता नहीं है bytes। क्या आप चीजों से प्राप्त कर रहे हैं requests? वेब संसाधन से आपको मिलने वाली एन्कोडिंग इससे भिन्न हो सकती है utf-8।
— हायो नायक

19

यह आपको यह बताने की कोशिश कर रहा है कि आप जिस ऑब्जेक्ट को प्रिंट कर रहे हैं वह एक स्ट्रिंग नहीं है, बल्कि बाइट के रूप में एक बाइट ऑब्जेक्ट है । लोग इसे अपूर्ण तरीके से समझाते हैं, इसलिए यहां मेरा विचार है।

बाइट शाब्दिक रूप से एक बाइट ऑब्जेक्ट बनाने पर विचार करें (शाब्दिक रूप से एक बाइट ऑब्जेक्ट का उपयोग करके एक बाइट ऑब्जेक्ट जैसे कि 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)फ़ंक्शन लागू करते हैं।

पायथन में बाइट्स

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>

5

इसे स्ट्रिंग में बदलने के लिए आपको इसे डीकोड करने की आवश्यकता है। Python3 में बाइट्स शाब्दिक के बारे में उत्तर की जाँच करें ।

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

1
इसके साथ समस्या यह है कि, जब मैं encode("utf-8")त्रुटियों के बिना ट्वीट डाउनलोड करने का प्रयास करता हूं। और, जैसा कि मैंने यहां उल्लेख किया है, stackoverflow.com/q/41915383/4422095 को हटाने से यह हल नहीं हुआ। भले ही मैं यू सुझाव के रूप में डिकोड का उपयोग करता हूं, फिर भी मुझे एक त्रुटि मिलती है। मैं उस पोस्ट में पोस्ट करूंगा।
— स्टेन शुनपाइक

किया हुआ। यह बिल्कुल वैसा ही नहीं है क्योंकि यू को इसे करने के लिए ट्विटर OAuth कोड की आवश्यकता है। लेकिन अगर यू सिर्फ उदाहरण मैंने दिया है, तो यू को भी यही समस्या होगी। यह यू द्वारा सुझाई गई विधि द्वारा हल नहीं किया गया है। यह सिर्फ utf-8 को खोल देता है। लेकिन यह काम नहीं करता है क्योंकि यह utf-8 एन्कोडिंग के बिना ट्वीट्स में वर्णों को संसाधित नहीं करेगा
— स्टेन Shunpike

आपको पाठ्यक्रम के सही एन्कोडिंग का उपयोग करना होगा। utf-8एक उदाहरण था।
— सलमानवेद


2

Django 2.0 के साथ अजगर 3.6 पर, एक बाइट शाब्दिक पर डिकोड अपेक्षा के अनुरूप काम नहीं करता है। हाँ, जब मैं इसे प्रिंट करता हूँ तो मुझे सही परिणाम मिलता है, लेकिन b'value 'अभी भी है अगर आप इसे सही प्रिंट करते हैं।

यह क्या im एन्कोडिंग है

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]

एक बेस 64 एनकोडेड स्ट्रिंग को डिकोड करता है, जो पीछे छोड़े गए किसी भी समान चिन्ह को जोड़ देता है।


यह मेरी 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-Version: 1.0 कंटेंट-ट्रांसफर-एन्कोडिंग: 7bit विषय: आपका MySite अकाउंट एक्टिवेट करें: वेबमास्टर @ localhost से: testuser@yahoo.com दिनांक: शुक्र, 20 मई 2018 06:26:46 - 0000 संदेश-आईडी: <152420560682.16725.4597194169307598579@Dash-U>

हाय परीक्षक,

कृपया अपने पंजीकरण की पुष्टि के लिए नीचे दिए गए लिंक पर क्लिक करें:

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/

अब यह ठीक काम करता है। :)


मेरा मानना ​​है कि समस्या डिकोड नहीं है, बल्कि इसके बजाय टेम्पलेट में ऑटोसस्केप बंद है जो कि बाइट को शाब्दिक रूप से स्ट्रिंग में स्ट्रिप करने में असमर्थ है जैसे डिकोड करता है।
— फर्नांडो डी Jaime

1

मैं यह केवल 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)

यानी: एपीआई से डेटा इकट्ठा करते समय एनकोड न करें, केवल आउटपुट (प्रिंट या राइट) को एनकोड करें।


0

यह मानते हुए कि आप तुरंत इसे फिर से डिकोड नहीं करना चाहते हैं जैसे कि अन्य लोग यहां सुझाव दे रहे हैं, आप इसे एक स्ट्रिंग पर पार्स कर सकते हैं और फिर बस प्रमुख '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"   

-2

हालाँकि यह सवाल बहुत पुराना है, लेकिन मुझे लगता है कि यह उसी समस्या का सामना करने में मददगार हो सकता है। यहाँ ग्रंथ नीचे की तरह एक स्ट्रिंग है:

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

इस प्रकार आप इसे एन्कोडिंग द्वारा b नहीं हटा सकते क्योंकि यह बाइट नहीं है। इसे हटाने के लिए मैंने निम्न कार्य किया।

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

जो देगा "I posted a new photo to Facebook"


3
नहीं, वह देगा "I posted a new photo to Facebook'"। वैसे भी सवाल यह नहीं है।
— ट्रिपल एफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.