Python:获取字符串大小(以字节为单位)


76

我有一个要通过网络发送的字符串。我需要检查它所代表的总字节数。

sys.getsizeof(string_name)返回额外的字节。例如对于sys.getsizeof("a")return 22,而在python中一个字符仅以1个字节表示。还有其他方法可以找到这个吗?


您正在使用哪个版本的Python?
squiguy 2015年

6
这是因为字符串“ a”是python中包含额外信息的对象。
克里斯(Kris)

@Some Developer是否有一种只获取字符串字节的方法,而没有完整对象的额外信息?
Iffat Fatima 2015年

@squiguy我的python版本是2.7.9
Iffat Fatima 2015年

Answers:


128

如果您想要一个字符串中的字节数,此函数应该为您做的很扎实。

def utf8len(s):
    return len(s.encode('utf-8'))

您得到怪异数字的原因是,由于字符串是python中的实际对象,因此封装在字符串中还有许多其他信息。

有趣的是,如果您看一下我的将字符串编码为'utf-8'的解决方案,则's'对象(这是一个字符串)上有一个'encode'方法。好吧,它需要存储在某个地方吗?因此,高于正常的字节数。它包括该方法以及其他一些方法:)。


别担心。有时,简单的答案会导致看似奇怪的问题哈哈。
克里斯(Kris)2015年

15
编码的原因是,在Python 3中,某些单字符字符串将需要表示多个字节。例如:len('你'.encode('utf-8'))
布拉德·所罗门

12

需要接受的答案有一个警告。

对于某些多字节编码(例如utf-16),string.encode将在开头添加字节顺序标记(BOM),这是一系列特殊字节,可告知读者所使用的字节字节序。所以你得到的长度实际上是len(BOM) + len(encoded_word)

如果不想计算BOM字节数,则可以使用编码的小端版本(添加后缀“ -le”)或大端版本(添加后缀“ be”)。

>>> len('ciao'.encode('utf-16'))
10
>>> len('ciao'.encode('utf-16-le'))
8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.