今天上班,看到下面這行代碼:
decoded_token = base64.b64decode(api_token.encode("utf-8")).decode("utf-8")
它是 AirFlow ETL 腳本的一部分,decoded_token在 API 請求中用作承載令牌。這段代碼在使用 Python 2.7 的服務器上執行,我的同事告訴我,這段代碼每天都能成功運行。
然而,據我了解,代碼首先嘗試轉換api_token為位元組(.encode),然后將位元組轉換為字串(base64.b64decode),最后再將字串轉換為字串(.decode)。我認為這總是會導致錯誤。
import base64
api_token = "random-string"
decoded_token = base64.b64decode(api_token.encode("utf-8")).decode("utf-8")
在本地運行代碼給了我:
錯誤:UnicodeDecodeError: 'utf8' codec can't decode byte 0xad in position 0: invalid start byte
需要什么輸入/型別api_token才能使該行不引發錯誤?這甚至可能嗎,還是必須有其他東西在起作用?
編輯:正如 Klaus D. 所提到的,顯然,在 Python 2 中,兩者都encode消耗decode并回傳了一個字串。然而,在 Python 2.7 中運行上面的代碼給了我同樣的錯誤,我還沒有找到api_token不會引發錯誤的輸入。
uj5u.com熱心網友回復:
問題可能只是您的測驗輸入字串不是 base64 編碼的字串,而在生產中,無論輸入已經是什么!
Python 2.7.18 (default, Jan 4 2022, 17:47:56)
...
>>> import base64
>>> api_token = "random-string"
>>> base64.b64decode(api_token)
'\xad\xa9\xdd\xa2k-\xae)\xe0'
>>> base64.b64decode(api_token).decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xad in position 0: invalid start byte
將字串編碼為 base64,之后您也不需要將其解碼為“utf-8”,但如果您希望使用 unicode 字符,則可以
>>> api_token = base64.b64encode(api_token)
>>> api_token
'cmFuZG9tLXN0cmluZw=='
>>> base64.b64decode(api_token)
'random-string'
>>> base64.b64decode(api_token).decode("utf-8")
u'random-string'
非 ASCII 字符的示例
>>> base64.b64decode(base64.b64encode("random string后綴"))
'random string\xe5\x90\x8e\xe7\xbc\x80'
>>> base64.b64decode(base64.b64encode("random string后綴")).decode("utf-8")
u'random string\u540e\u7f00'
>>> sys.stdout.write(base64.b64decode(base64.b64encode("random string后綴")) "\n")
random string后綴
請注意,在 Python 2.7 中,bytes它只是 的別名str,并且添加了一個特殊unicode的來支持 unicode!
>>> bytes is str
True
>>> bytes is unicode
False
>>> str("foo")
'foo'
>>> unicode("foo")
u'foo'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/454525.html
標籤:Python python-2.7 空气流动
上一篇:如何僅固定CollapsingToolbarLayout的最后一個子項?
下一篇:檢查串列的部分值并回傳整個值
