如何将Python 2.7的%格式化字符串转为Python 3.10的f-string
替换Python 2.7 %格式化为Python 3.x更优写法的方案
有没有必要替换?
建议替换。虽然Python 3.x仍兼容%格式化,但f-string(Python 3.6+支持)和str.format()是更现代、更符合Python最佳实践的写法,优势包括:
- 可读性更强:格式规则与对应变量直接绑定,字段较多时不易混淆顺序
- 功能更灵活:支持嵌入表达式、函数调用等复杂逻辑
- 性能更优:f-string是编译时解析,运行效率高于
%格式化
实现方案
方案1:直接使用f-string(无需复用格式时首选)
f-string通过{内容:格式}的语法实现对齐和宽度控制,完全对应原%格式化的规则:
header = f"{'ID':<5} {'SerialNumber':<12}{'Cabinet':>3} {'Type':<10} {'Last Update':<20} {'Status':<8}{'Result':<18}{'Fail':<4} {'Pass':<4} {'Instructions':<46} {'Resolution':<16}\n"
格式说明:
<n:左对齐,宽度为n(对应原%-ns)>n:右对齐,宽度为n(对应原%ns)
方案2:复用格式模板(需多次使用相同格式时)
如果后续还要用同样的格式填充其他数据行,可以用str.format()定义可复用的模板:
# 定义通用格式模板 format_template = "{:<5} {:<12}{:>3} {:<10} {:<20} {:<8}{:<18}{:<4} {:<4} {:<46} {:<16}\n" # 填充表头数据 header = format_template.format( 'ID', 'SerialNumber', 'Cabinet', 'Type', 'Last Update', 'Status', 'Result', 'Fail', 'Pass', 'Instructions', 'Resolution' ) # 后续填充其他数据行示例 data_row = format_template.format( '001', 'SN1234567890', 'A1', 'Server', '2024-05-20 14:30', 'Online', 'Passed', '0', '1', 'System check completed', 'No action needed' )
方案3:封装为函数(复杂场景下更易维护)
如果格式规则需要调整或多处调用,封装成函数更灵活:
def format_table_row(id_, serial, cabinet, type_, last_update, status, result, fail, pass_, instructions, resolution): return f"{id_:<5} {serial:<12}{cabinet:>3} {type_:<10} {last_update:<20} {status:<8}{result:<18}{fail:<4} {pass_:<4} {instructions:<46} {resolution:<16}\n" # 生成表头 header = format_table_row( 'ID', 'SerialNumber', 'Cabinet', 'Type', 'Last Update', 'Status', 'Result', 'Fail', 'Pass', 'Instructions', 'Resolution' )
以上三种方案的输出结果与原%格式化代码完全一致,且更符合Python 3.x的编码习惯。
内容的提问来源于stack exchange,提问作者mecook112
相关产品推荐
相关产品推荐

