如何以更简洁的Pythonic方式实现可变长字符串转固定长度以适配struct.pack()?
更简洁的字符串固定长度适配实现
当然有更简洁的写法!你可以把截断和填充逻辑合并成一行代码,利用Python字符串的切片特性和ljust()方法的行为,完美替代原来的分支判断:
def make_str_this_len(in_str, size): return in_str[:size].ljust(size)
为什么这行代码能生效?
- 截断逻辑:
in_str[:size]会自动处理过长的情况——如果原字符串长度大于size,直接取前size个字符;如果长度小于等于size,就返回整个原字符串。 - 填充逻辑:
ljust(size)会检查当前字符串的长度:如果已经等于size,直接返回原字符串;如果不足,就用空格(默认填充字符)在右侧补到指定长度。
测试示例
用你给出的测试值验证:
in_str = 'abcd1234' # 当size=12时 print("resulting string:[{0}], len={1}".format(make_str_this_len(in_str, 12), len(make_str_this_len(in_str, 12)))) # 输出:resulting string:[abcd1234 ], len=12 # 当size=4时 print("resulting string:[{0}], len={1}".format(make_str_this_len(in_str, 4), len(make_str_this_len(in_str, 4)))) # 输出:resulting string:[abcd], len=4
扩展:自定义填充字符
如果需要用空格之外的字符填充(比如*),只需要给ljust()传入第二个参数即可:
def make_str_this_len(in_str, size, fill_char=' '): return in_str[:size].ljust(size, fill_char)
比如调用make_str_this_len('abcd', 6, '*')会返回'abcd**',同样满足截断+填充的需求。
内容的提问来源于stack exchange,提问作者Marc Compere
相关产品推荐
相关产品推荐

