You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'直接跳过错误字符

二、代码逻辑修正

除编码问题外,原代码还有几处逻辑错误,会导致统计结果完全偏离预期:

  1. 错误的分词方式:for word in line是遍历字符串的每个字符,而非拆分单词,需用split()先将句子拆分为单词列表。
  2. 变量顺序错误:处理单词过滤逻辑时,提前使用了未定义的word变量,应先获取每个单词再做过滤。
  3. 计数逻辑颠倒:原代码中,当单词在停用词列表里时才初始化计数,完全搞反了逻辑——应该只统计不在停用词里的单词。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:53:29