繁体   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