如何让Discord消息中的Python PrettyTable格式与本地一致?
解决Discord机器人PrettyTable格式错乱问题
问题根源在于Discord的消息渲染逻辑:Visual Studio控制台用等宽字体,能完美对齐ASCII表格,但Discord默认消息用比例字体,普通文本表格会因字符宽度不一致导致排版混乱。按以下方式修改即可解决:
1. 用代码块包裹表格内容
Discord中用三个反引号(```)包裹表格文本,会强制启用等宽字体渲染,ASCII表格的对齐效果就能和控制台一致。
2. 修正代码中的错误并优化输出
你的代码里有个Python语法错误:ToString()是C#的写法,Python里应该用str()或get_string()方法。另外可以让PrettyTable直接生成适配的格式,两种方案可选:
方案一:输出ASCII表格+代码块包裹
from prettytable import PrettyTable import json def get_list(dct): table = PrettyTable() # 统一设置左对齐,确保列对齐更稳定 table.align = "l" # 添加列名 for column in dct[0].keys(): table.add_column(column, []) # 添加行数据(简化写法) for item in dct: table.add_row(list(item.values())) # 返回ASCII格式的表格字符串 return str(table) async def on_message(message): if message.content.startswith('$LIST ToPlay'): with open('GameListData.json', 'r+') as file: data = json.load(file) msg = get_list(data['ToPlay']) # 用代码块包裹后发送 await message.channel.send(f"```\n{msg}\n```")
方案二:输出Markdown格式表格
直接让PrettyTable生成Discord支持的Markdown表格,无需代码块也能渲染出美观的表格:
from prettytable import PrettyTable import json def get_list(dct): table = PrettyTable() for column in dct[0].keys(): table.add_column(column, []) for item in dct: table.add_row(list(item.values())) # 生成Markdown格式的表格 return table.get_string(format="markdown") async def on_message(message): if message.content.startswith('$LIST ToPlay'): with open('GameListData.json', 'r+') as file: data = json.load(file) msg = get_list(data['ToPlay']) await message.channel.send(msg)
注意点
- 若用Markdown方案,要确保表格内容里没有
|等特殊字符,避免破坏Markdown语法; - 代码块方案兼容性更强,不管内容有没有特殊字符,都能保证对齐效果。
内容的提问来源于stack exchange,提问作者Eric S
相关产品推荐
相关产品推荐

