Python读取文件遇UnicodeDecodeError错误,请求解决编码问题
解决UnicodeDecodeError及代码逻辑问题
一、编码错误解决
出现UnicodeDecodeError是因为待处理的Greta_Thunberg_2019.txt并非UTF-8编码,字节0x97对应Windows-1252编码中的长破折号(—),用UTF-8解码自然失败。以下是两种可行的解决方式:
方式1:指定匹配编码打开文件
直接将打开目标文件的代码改为指定encoding='windows-1252'(最适配该字节的编码):
with open(filename, 'r', encoding='windows-1252') as f:
如果仍有问题,可尝试encoding='iso-8859-1',该编码能兼容所有单字节字符。
方式2:容错解码(不推荐,会丢失/替换字符)
若不确定文件编码,也可通过errors参数忽略或替换无法解码的字符:
with open(filename, 'r', encoding='utf-8', errors='replace') as f: # 或用errors='ignore'直接跳过错误字符
二、代码逻辑修正
除编码问题外,原代码还有几处逻辑错误,会导致统计结果完全偏离预期:
- 错误的分词方式:
for word in line是遍历字符串的每个字符,而非拆分单词,需用split()先将句子拆分为单词列表。 - 变量顺序错误:处理单词过滤逻辑时,提前使用了未定义的
word变量,应先获取每个单词再做过滤。 - 计数逻辑颠倒:原代码中,当单词在停用词列表里时才初始化计数,完全搞反了逻辑——应该只统计不在停用词里的单词。
修正后的完整代码
with open('stopwords.txt', 'r') as f: stopwords = set(line.strip() for line in f) filename = input("enter filename to process: ") word_counts = {} # 解决编码问题:指定windows-1252编码 with open(filename, 'r', encoding='windows-1252') as f: for line in f: line = line.strip().lower() # 拆分句子为单词列表 for raw_word in line.split(): # 过滤单词中的非允许字符 word = ''.join(c for c in raw_word if c.isalpha() or c == "'" or c == "-") # 只统计有效且不在停用词里的单词 if word and word not in stopwords: word_counts[word] = word_counts.get(word, 0) + 1 # 打印统计结果 for key, count in word_counts.items(): print(key, ":", count)
内容的提问来源于stack exchange,提问作者alexa hrnicek
相关产品推荐
相关产品推荐

