读取 python 中的文件时出现编解码器错误 - 'charmap' 编解码器无法解码位置 3124 中的字节 0x81:字符映射到 <undefined>

Codec error while reading a file in python - 'charmap' codec can't decode byte 0x81 in position 3124: character maps to <undefined>

我正在从事一个机器学习项目,该项目从所有电子邮件中过滤 spam/phishing 封电子邮件。为此,我使用了 SpamAssassin 数据集。数据集包含这种格式的不同邮件:

为了识别网络钓鱼邮件,我要做的第一件事就是找出该邮件有多少个网络链接。为此,我编写了以下代码:

wordsInLine = []
tempWord = []
urlList = []
base_dir = "C:/Users/keert/Downloads/Spam_Assassin/spam"

def count():
    flag = 0
    print("Reading all file names in sorted order")
    for filename in sorted(os.listdir(base_dir)):
        file=open(os.path.join(base_dir, filename))
        count1 = 0
        for line in file:
            
            wordsInLine = line.split(' ')
            for word in wordsInLine:
                
                if re.search('href="http',word,re.I):
                    count1=count1+1

        file.close()
        urlList.append(count1)
        if flag!=0:
            print("File Name = " + filename)
            print ("Number of links = ",count1)
        flag = flag + 1

count()
final = urlList[1:]
print("List of number of links in each email")
print(final)

with open('count_links.csv', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for val in final:
        wr.writerow([val])

print("CSV file generated")

但是这段代码给我一个错误提示:'charmap' codec can't decode byte 0x81 in position 3124: character maps to

我什至尝试通过添加 encoding = 'utf8' 选项打开文件。但是,冲突仍然存在,我收到如下错误:'utf-8' codec can't decode byte 0x81 in position 3124: character maps to

我想这是由于文件中的特殊字符造成的。有什么办法可以解决这个问题,因为我不能跳过特殊字符,因为它们也很重要。请建议我这样做的方法。提前谢谢你


您必须使用写入文件时使用的相同编码打开和读取文件。在这种情况下,这可能有点困难,因为您正在处理 e-mails 并且它们可以采用任何编码,具体取决于发件人。在您显示的示例文件中,消息使用 'iso-8859-1' 编码进行编码。

然而,e-mails 有点奇怪,因为它们由一个 header(据我所知是 ASCII 格式),后跟一个空行和 body. body 以 header 中指定的编码进行编码。所以可以在同一个文件中使用两种不同的编码!

如果您确定所有 e-mails 使用 iso-8859-1 编码并且您正在寻找 quick-and-dirty 解决方案,那么您也可以使用 [= 打开文件21=] 编码,因为 e-mail header 与 iso-8859-1 兼容。但是,请做好准备,您还必须处理其他 e-mail formatting/encoding/escaping 问题,否则您的脚本可能无法完全按预期运行。

我认为最好的解决方案是寻找一个可以处理 e-mails 的 Python 模块,这样它就会处理所有的解码工作,您不必担心这个.它还将解决其他问题,例如转义字符和换行符。

我自己没有这方面的经验,但 Python 似乎 built-in 支持使用 e-mail package 解析 e-mails。我建议看一看。