Python导入文本数据时长横线被替换为乱码该如何解决?
一、已生成乱码的清理方案
乱码符号�是Unicode替换字符(U+FFFD),直接替换失败大多是没有匹配到该字符的Unicode编码,可按以下方式处理:
- 直接替换目标字符
# text为已经读入的包含乱码的文本变量 clean_text = text.replace("\ufffd", " ")
如果替换后还有残留,可过滤所有不可打印字符:
clean_text = "".join([c for c in text if c.isprintable()])
- 重新编码修复
把读入的文本按之前错误的编码转回字节流,再用正确编码重新解码,未知字符可选择忽略或替换:
# 假设之前错误使用latin-1编码读入文件 raw_bytes = text.encode("latin-1") # 用utf-8重新解码,errors="ignore"会直接丢弃无法识别的字符 fixed_text = raw_bytes.decode("utf-8", errors="ignore")
二、导入阶段避免乱码的最优方案
该乱码的根本原因是读入文件时使用的编码和源文件的实际编码不匹配,源文件中的长横线是En Dash(U+2013)字符,错误编码(比如ASCII、latin1)无法识别该字符就会生成乱码。导入时显式指定正确的文件编码即可解决:
- 原生Python读入文本
# 绝大多数场景下源文件为utf-8编码,直接指定即可正确识别长横线 with open("目标文件路径.txt", "r", encoding="utf-8") as f: content = f.read()
如果是Windows系统生成的文本文件,可尝试encoding="gbk";如果是带BOM的UTF-8文件,可尝试encoding="utf-8-sig"。
- 用pandas导入表格类文件
对应指定encoding参数即可:
import pandas as pd # 导入csv文件 df = pd.read_csv("目标文件路径.csv", encoding="utf-8")
如果不知道源文件编码,可通过chardet库自动检测:
import chardet # 先以二进制模式读入文件内容检测编码 with open("目标文件路径.txt", "rb") as f: raw_content = f.read() file_encoding = chardet.detect(raw_content)["encoding"] # 用检测到的编码读入文件即可 with open("目标文件路径.txt", "r", encoding=file_encoding) as f: content = f.read()
内容的提问来源于stack exchange,提问作者totalsurfer_v1
相关产品推荐
相关产品推荐

