为什么可以';t Python';s string.format pad,带“"\x00";?
我想用空字符(“\x00”)填充字符串。我知道很多方法可以做到这一点,所以请不要用其他方法回答。我想知道的是:为什么Python的为什么可以';t Python';s string.format pad,带“"\x00";?,python,string-formatting,Python,String Formatting,我想用空字符(“\x00”)填充字符串。我知道很多方法可以做到这一点,所以请不要用其他方法回答。我想知道的是:为什么Python的string.format()函数不允许使用空值填充 测试用例: >>> "{0:\x01<10}".format("bbb") 'bbb\x01\x01\x01\x01\x01\x01\x01' 这可以工作,但不使用string.format >>> spaces = "{0: <10}".format("bbb")
string.format()
函数不允许使用空值填充
测试用例:
>>> "{0:\x01<10}".format("bbb")
'bbb\x01\x01\x01\x01\x01\x01\x01'
这可以工作,但不使用string.format
>>> spaces = "{0: <10}".format("bbb")
>>> nulls = "{0:\x00<10}".format("bbb")
>>> spaces == nulls
True
>空格=”{0:因为Python2.7中的string.format
方法是Python3string.format
的后端口。Python2.7 unicode是Python3字符串,其中Python2.7字符串是Python3字节。字符串是在Python3中表示二进制数据的错误类型。您将使用没有格式方法的字节。因此,确实应该e问为什么格式
方法在2.7中是字符串,而实际上它应该是unicode类型,因为这就是Python3中的字符串
我猜答案是在那里放太方便了
关于为什么还没有深入研究Python 2.7的源代码,我在/Objects/stringlib/formatter.h
的第718-722行(版本2.7.3)中发现了这个问题:
问题在于,当未指定填充字符时,零/空字符('\0'
)被用作默认字符。这是为了启用此行为:
>>> "{0:<10}".format("foo")
'foo '
{0:原始问题的答案是它是python中的一个bug
它被证明是被允许的,但不是。它是在2014年修复的。对于python 2,该修复首次出现在2.7.7或2.7.8中(我不知道如何区分)
原始跟踪。请在否决投票时留下评论,这样我可以改进这个问题。我已经做了研究,知道了ljust
和其他完成任务的方法。我想知道python 2.7为什么会这样。使用print“bbb”+“\x00”*7
可以得到一个带7个空格的字符串。Shell始终打印“\x00”作为空格字符。如果没有打印shell,则返回字符串的repr
版本。这将产生相同的结果:u”{0:\x00@bonsaiviking是的,关键是.format
不适用于二进制数据,也不应用于二进制数据。尝试对二进制数据使用unicode方法是行不通的。
>>> "bbb" + "\x00" * 7
'bbb\x00\x00\x00\x00\x00\x00\x00'
>>> spaces = "{0: <10}".format("bbb")
>>> nulls = "{0:\x00<10}".format("bbb")
>>> spaces == nulls
True
/* Write into that space. First the padding. */
p = fill_padding(STRINGLIB_STR(result), len,
format->fill_char=='\0'?' ':format->fill_char,
lpad, rpad);
>>> "{0:<10}".format("foo")
'foo '