1

我正在开发一个机器学习项目,该项目从所有电子邮件中过滤垃圾邮件/网络钓鱼电子邮件。为此,我使用 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'编解码器无法解码位置 3124 中的字节 0x81:字符映射到

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

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


4

1 回答 1

1

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

然而,电子邮件有点奇怪,因为它们包含一个标题(据我所知是 ASCII 格式),然后是一个空行和正文。正文以标头中指定的编码进行编码。所以可以在同一个文件中使用两种不同的编码!

如果您确定所有电子邮件都使用 iso-8859-1 编码并且您正在寻找一个快速而肮脏的解决方案,那么您也可以使用“iso-8859-1”编码打开文件,因为电子邮件标头与 iso-8859-1 兼容。但是,请准备好您还必须处理其他电子邮件格式/编码/转义问题,否则您的脚本可能无法完全按预期工作。

我认为最好的解决方案是寻找一个可以处理电子邮件的 Python 模块,这样它就可以处理所有的解码内容,而您不必担心这一点。它还将解决其他问题,例如转义字符和换行符。

我自己没有这方面的经验,但似乎 Python 内置了对使用电子邮件包解析电子邮件的支持。我建议看一下。

于 2021-03-05T14:06:13.730 回答