Windows下Python tabulate生成fancy_grid表格控制台正常,写文件报编码错
问题核心原因
fancy_grid格式生成的表格由大量Unicode制表符(如╔、═、╗、║等非ASCII字符)组成,控制台打印正常是因为当前Windows终端默认开启了UTF-8字符渲染支持。- Windows环境下Python打开文件执行写入操作时,默认采用cp1252西语编码规则,该编码无法识别上述Unicode制表符,因此在执行写入逻辑时直接抛出
UnicodeEncodeError。 - 普通格式表格可正常写入、导出docx时也触发同类报错,本质都是默认编码未兼容非ASCII字符集导致,和tabulate格式、导出的文件格式本身无直接关联。
解决方法
方法1:写入文件时显式指定UTF-8编码
这是最直接的修复方案,修改原有open函数的调用参数,增加编码声明即可:
from tabulate import tabulate import os # 补充原有代码遗漏的os模块导入,避免调用startfile时触发名称未定义报错 l = [['{:<118}.'.format("Hassan"), 21, "LUMS"], ["Ali", 22, "FAST"], ["Ahmed", 23, "UET"]] table = tabulate(l, headers=['Name', 'Age', 'University'], tablefmt='fancy_grid', showindex="always") # 新增encoding="utf-8"参数,匹配Unicode制表符的编码要求 with open("C:\\Users\\John\\Desktop\\kaita.txt", "w", encoding="utf-8") as outf: outf.write(table) os.startfile("C:\\Users\\John\\Desktop\\kaita.txt", "print")
注意:Windows 10 1903及以上版本的记事本、打印组件均可正常识别UTF-8编码的文本,不会出现乱码;若使用老版本Windows打开出现乱码,可在记事本的打开弹窗中手动选择UTF-8编码加载文件。
方法2:带BOM标识的UTF-8写入
如果需要让系统、打印组件更准确识别文件编码,省去手动选择编码的操作,可以将编码参数替换为utf-8-sig:
# utf-8-sig会在文件开头自动写入UTF-8 BOM标识,系统识别编码的准确率更高 with open("C:\\Users\\John\\Desktop\\kaita.txt", "w", encoding="utf-8-sig") as outf: outf.write(table)
- 该编码格式与纯UTF-8的内容完全兼容,仅多了3字节的编码标识头,不会影响表格内容的正常渲染,也不会破坏打印效果。
- 之前尝试导出docx时遇到的同类编码报错,只要在文本拼接写入环节保证采用UTF-8规则处理字符串,同样可以解决这类编码不兼容问题。
内容的提问来源于stack exchange,提问作者Johnn Kaita
相关产品推荐
相关产品推荐

