繁体   English   中英

python字符串和二进制数据

[英]python strings and binary data

我的问题是关于python 3.0字符串。

  1. 我的理解是,对于行str = "a" ,字符'a'被编码(例如使用utf-8)并存储在str对象中。 如果'a'的UTF-8表示是1字节,则字符串是1字节长。 我对吗?

  2. 如果上述情况属实,当我们使用read()读取二进制文件时会发生什么。 假设我有一个带有两个字节的二进制数据的双字节文件,我使用read命令在字符串中读取它

     open(fileName, mode='rb') str= file.read() 

    现在str将是两个字节长,每个字节将存储在fileName中。 我对吗?

  3. 如果我在上面的点是对的,那么str对象不是任何特定的编码格式(如UTF等),那么python字符串总是unicode是什么意思呢? 如果我调用str.encode()会发生什么。 这没有意义吗?

  4. 从文件读取的str对象实际上是一个字节数组。 有没有办法将其转换为bytearray类型?

你很困惑。 “编码”属于字节字符串 ,而不是unicode字符串 有意义的语句:“此字节字符串是utf-8编码的。”,“此字节字符串长度为2个字节。” 无意义的语句:“这个unicode字符串是utf-8编码的”,“这个unicode字符串是2个字节长”

  1. str = "a"表示“创建一个unicode字符串'a'和一个名为str的引用”。 Unicode字符串当然存储在某种编码中,因为它需要在内存中作为字节存在,但这并不重要。 您的所有代码都将其视为根本没有编码 - 它已从字节中抽象出来。 unicode字符串是一系列unicode代码点 (即表示字符的整数)。
  2. 是的,不是。 str here( read()的返回值)是字节字符串 ,而不是unicode字符串 "a" != b"a"
  3. 您的字节字符串str具有未知编码 ,必须进行解码才能生成unicode字符串。 字节字符串没有encode()方法,因为它没有意义 - 它们或者已经是unicode字符串的编码,或者它们根本不表示unicode字符串(例如图像)。
  4. 它不是一个字节数组,而是一个字节串。 bytearray是一个可变的字节列表。 您可以使用bytearray(byte_string)生成bytearray,但是bytearrays用于相当专业的用途(例如,避免复制send-recv缓冲区),而不是偶然使用。 通常你只需要一个字节串。

以二进制模式读取文件时, read()方法返回的值是bytes对象,而不是str对象。 文档深入介绍了这一点。

>>> with open('foo', mode='rb') as f: s = f.read()
... 
>>> s
b'abc\n'
>>> len(s)
4
>>> type(s)
<class 'bytes'>

Python字符串存储Unicode代码点

代码点与字节不同。 字节是数字的计算机表示(通常在0到255之间),并且这些数字可以通过解码过程转换为代码点,而在另一个方向上通过编码转换。 Python 3字符串包含代码点,每个字符对应一个字符。

Python源代码可以使用一系列字节定义字符串文字,默认情况下解释器使用UTF-8编解码器解码为unicode,但您可以在文件顶部设置其他编解码器。 在磁盘上,UTF-8编码中的字母a确实只是一个字节,这是UTF-8标准的性质。

如果您在文本模式下读取文件,Python会自动为您应用解码过程,但是当您以二进制模式打开它时,不会进行解码,而是获得bytes对象。 该对象的内容应该完全反映文件的内容。 请注意,它不是 str类型,它不是unicode,它甚至不是Python字符串。 要将字节转换为字符串,您需要使用.decode()方法显式解码。

bytes值中简单地创建一个bytearray ,只需在其上调用bytesarray()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM