Python:用读入文件替换字符错误

时间:2016-09-14 03:02:55

标签: python spam bayesian

目标:我只想把逗号拿走,因为这是唯一会搞砸我(课程所需)文件解析贝叶斯分析(即单词,2,4)而不是说(即单词,2)的字符,4)

因此,我正在尝试在线发送电子邮件,其中包含来自安然公共语料库的文本文件,并构建一个贝叶斯垃圾邮件过滤器。

我注意到在尝试操作存在的字符串时,读取某些文件会引发错误。我完全知道这些文件中的一些包含病毒,因此某些字符的编码可能无效。但是,我试图简单地替换字符串中的逗号,我收到以下错误:

UnicodeDecodeError:'ascii'编解码器无法解码位置1169中的字节0xc1:序数不在范围内(128)

我已经尝试了这个论坛提供的所有内容,并且我到处寻找解决方案,例如:

with open(file+file_path_stings[i],'r') as filehandle:
        words = str(filehandle.read())
        words = words.replace(',','')
        words = words.split()

我也尝试了许多正则表达式尝试......这是其中一个版本:

with open(file+file_path_stings[i],'r') as filehandle:
        words = str(filehandle.read())
        words = re.sub(',','',words)
        words = words.split()

现在,我可以简单地只使用一个只允许A-Za-z通过的版本,但我注意到垃圾邮件的准确性受到许多垃圾邮件文件具有此类特殊字符这一事实的严重影响。

任何建议都会受到最高的赞赏。感谢。

-Robert

2 个答案:

答案 0 :(得分:2)

如果您只想删除额外的逗号并且正如您所说的那样,您可以使用简单的拆分和连接(假设逗号是此处唯一的分隔符)

','.join([s for s in 'word,,2,4'.split(',') if s])

答案 1 :(得分:0)

所以我最终使用了另一个我觉得有用的实现。事实证明,由于某种原因,python保留了它之前存在的任何先前字符串的任何先前信息。所以我已经知道将它重新分配给不同的(新)变量总是一个好主意,如下所示:

func readShortInteger() -> Int16
{
    let highByte = self.readByte()
    let lowByte = self.readByte()

    return Int16(highByte) << 8 | Int16(lowByte)
}

就存储和分配数据到另一个变量而言,它的成本要高一些。但是,我注意到它在你的字符串没有被转换为unicode字符串方面更安全。最初的问题是这个输出

with open(file+file_path_stings[i],'r') as filehandle:
    words = str(filehandle.read()).split()
    new_array = []
    for word in words:
        new_array.append(word.replace(',','').lower())
    return new_array

'hello'中的逗号不会被替换。使用上面的代码,您可以保证将从每个单词中删除逗号,而不会将其转换为unicode字符串

 print words

 [u'hello,',u'what?',u'is',u'going',u'on?']

就代码的性能而言,我仍然以适当的速度训练大量文件。所以它会影响你那么多。

希望这有帮助!

-Robert