指定编码仍乱码:Pandas读写含重音字符CSV文件异常
解决CSV导出UTF-8乱码问题
嘿,我来帮你搞定这个编码乱码的问题!咱们一步步来分析和解决:
问题根源分析
- 首先你的代码里有个小语法错误:
with open("out.txt"), "w", newline='') as f:这里括号位置写错了,多了一个右括号,正确写法应该是with open("out.txt", "w", newline='') as f:。不过这不是乱码的核心原因,真正的问题出在编码设置的冲突上。 - 当你把手动打开的文件对象传给
to_csv的path_or_buf参数时,to_csv里的encoding参数会直接失效——因为文件流的编码已经由open()函数决定了。你打开文件时没指定编码,系统就会用默认编码(比如Windows下常是cp1252或者GBK)来写入文件,这就导致你以为是按UTF-8导出,实际却是用了其他编码,自然出现乱码。
两种可行的解决方案
方案一:直接用to_csv的路径参数(最简洁)
让Pandas自己处理文件流和编码,不用手动调用open(),这样能避免编码冲突:
dataset = pd.read_csv("my_file.csv", sep=";", encoding="ISO-8859-1") print(dataset.loc[0, "my_col"]) # 输出 "s'il vous plaît" # 直接指定文件路径和UTF-8编码导出 dataset.to_csv("out.txt", sep="\t", header=False, index=False, encoding="utf-8")
方案二:手动打开文件时指定UTF-8编码
如果你一定要用open()来管理文件流,记得在打开时就指定encoding="utf-8",此时to_csv的encoding参数可以省略(留着也不会生效):
dataset = pd.read_csv("my_file.csv", sep=";", encoding="ISO-8859-1") print(dataset.loc[0, "my_col"]) # 输出 "s'il vous plaît" # 打开文件时明确指定UTF-8编码 with open("out.txt", "w", newline='', encoding="utf-8") as f: dataset.to_csv(path_or_buf=f, sep="\t", header=False, index=False)
验证结果
导出完成后,用PyCharm或Sublime重新打开out.txt,应该能正常显示s'il vous plaît,而且编辑器会识别出文件编码是UTF-8啦。
内容的提问来源于stack exchange,提问作者Be Chiller Too




