簡體   English   中英

Python3 str(),字節和unicode

[英]Python3 str(), bytes, and unicode

我在編寫的這段代碼所涉及的類型方面遇到了麻煩。 理想情況下,我不介意編碼類型,但有時您會被迫。

因此,所有這些都圍繞Windows上NTFS FS的目錄路徑進行。 文件名中的某些字符(似乎是unicode)無法寫出到文件或無法打印到標准Windows終端機(是的,我嘗試使用“ chcp 65001”進行打印,但不起作用,但是我需要寫到一個標准的純文本文件)

因此,我執行以下操作。 據我了解,Python3(我正在使用3.2.2)是unicode,所以str()對象(以及所有支持的libs)是unicode,所以我這樣做了:

absfilepath = os.path.join(root, file).encode()

認為將返回utf-8字符串,並且一切都很好,但是當我去寫文件或輸出stdout時,我遇到了關於隱式類型轉換為str()錯誤。 所以我做了以下事情:

hashmap[checksum] = str(absfilepath)

(哈希圖將在以后轉儲)。

現在想想它在本地unicode Python3字符串中...但是當我將其轉儲到文件中時,使用以下命令:

for key, val in m.items():
    f.write(key + "|" + val + "\n")

我仍然在文件中得到這個:

e77bceb64d179377731a94186e56281c|b'K:\Filename'

指示為字節數組。

那我在做什么錯呢? 對不起,“非傳統”字符在此目錄樹中,我希望它們不在那里,但它們在那里。 如何將它們存儲(轉換為它們?)為可以用普通純文本(ASCII?)打印/書寫的方式?為什么從我顯然存儲有標准字符串的哈希圖中返回一個字節數組? 對我來說,處理unicode一直是非常恐怖的經歷。

absfilepath = os.path.join(root, file).encode()

os.path.join()返回一個字符串, str.encode()將字符串轉換為字節對象,因此absfilepath包含一個字節對象。

hashmap[checksum] = str(absfilepath)

當您對bytes對象調用str()時, 不會解碼bytes對象,而是創建一個字符串表示形式:

>>> str(b'K:\Filename')
"b'K:\\\\Filename'"
>>> str(b'K:\Filename') == repr(b'K:\Filename')
True

因此,您的詞典現在包含許多"b'some-bytes-string'"字符串。

“修復”很簡單:只是不要對從os.path.join獲得的字符串進行編碼。


如果在將字符串寫到文件時遇到錯誤,請在以文本模式打開文件時考慮指定顯式編碼:

with open('some_file', 'w', encoding='utf-8') as f:
    …

然后,Python將自動正確地編寫字符串。

另外,為完全安全起見,您還可以以二進制模式打開文件並編寫編碼后的字符串:

with open('some_file', 'bw') as f:
    value = key + "|" + val + "\n"
    f.write(value.encode()) # write a bytes object

但是,只要您 Python中,就不必擔心字符串對象中的特殊字符。 Python可以處理它們; 通常只是輸出設備發生故障(例如,打印到控制台)。

您編碼了unicode字符串:

absfilepath = os.path.join(root, file).encode()
#                                      ^^^^^^^^

這將產生一個字節串。 要么不編碼,要么在將路徑存儲在hashmap再次解碼

hashmap[checksum] = absfilepath.decode()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM