如何将列表中字符串转为UTF-8?分词后乱码问题求助
解决文本分词乱码与编码转换问题
为什么会出现乱码?
从你输出的ÿþp\x00a\x00r\x00t\x00这类内容来看,你的文本文件是UTF-16LE编码(带BOM),但你打开文件时没有指定编码,Python使用了系统默认编码读取,导致把双字节的UTF-16字符拆成了单字节,出现了大量\x00空字节和BOM字符ÿþ。
修正代码解决乱码
修改open()函数,明确指定文件编码为utf-16(Python会自动处理开头的BOM),这样就能正确读取文件内容:
import glob # 用原始字符串包裹路径,避免反斜杠转义问题 files = glob.glob(r"D:\Pakistan Constitution\*.txt") documents = [] for file in files: # 指定编码为utf-16,解决乱码问题 with open(file, encoding='utf-16') as f: documents.append(f.read()) stoplist = set('for a of the and to in'.split()) texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents] print(texts)
关于将列表字符串转换为UTF-8编码
在Python中,字符串本身是Unicode编码的内存对象,所谓“转成UTF-8”其实是将Unicode字符串编码为UTF-8格式的字节序列。如果需要把列表里的字符串转成UTF-8字节,可以这样做:
# 将texts中的每个单词转成UTF-8字节 utf8_texts = [[word.encode('utf-8') for word in doc] for doc in texts] # 如果要保存为UTF-8编码的文件,写入时指定encoding='utf-8'即可 with open("output.txt", "w", encoding='utf-8') as f: for doc in texts: f.write(' '.join(doc) + '\n')
额外提示
- 如果不确定文件编码,可以用
chardet库检测:先安装pip install chardet,然后读取文件前几个字节检测编码:import chardet with open(file, 'rb') as f: result = chardet.detect(f.read(1000)) print(result['encoding']) # 输出文件的编码,比如utf-16le
内容的提问来源于stack exchange,提问作者Kumail Abbas
相关产品推荐
相关产品推荐

