Python: 用读入文件替换字符错误
Python: Replacing character error with read in file
目标:我只想去掉逗号,因为这是唯一会搞砸我的(课程要求)文件解析以进行贝叶斯分析(即 word,2,4)而不是 say(即 word, ,2,4)
所以我目前正在尝试阅读来自 Enron public 在线语料库的文本文件形式的电子邮件,并构建贝叶斯垃圾邮件过滤器。
我注意到在尝试操作存在的字符串时,读取某些文件会引发错误。我完全知道其中一些文件包含病毒,因此某些字符的编码可能无效。但是,我试图简单地替换字符串中的逗号,但出现以下错误:
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 通过的版本进行正则表达式,但我注意到垃圾邮件的准确性受到很多垃圾邮件文件具有此类特殊字符这一事实的严重影响。
如有任何建议,我们将不胜感激。谢谢
-罗伯特
如果您只是想删除多余的逗号,而正如您所说,没有任何效果,您可以使用简单的拆分和连接(假设逗号是此处唯一的分隔符)
','.join([s for s in 'word,,2,4'.split(',') if s])
所以我最终使用了另一个我发现也很有用的实现。事实证明,出于某种原因,python 保留了它对最初存在的任何先前字符串的所有先前信息。所以我了解到将它重新分配给一个不同的(新)变量总是一个好主意,如下所示:
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
就存储数据和将数据分配给整个其他变量而言,它的成本要高一些。但是,我注意到就您的字符串而言,它不会被强制转换为 unicode 字符串,这要安全得多。最初的问题是这个输出
print words
[u'hello,',u'what?',u'is',u'going',u'on?']
'hello' 中的逗号不会被替换。使用上面的代码,您可以保证逗号将从每个单词中删除,而不是转换为 unicode 字符串
print new_array
['hello','what?',u'is',u'going',u'on?']
就代码的性能而言,我仍在以不错的速度训练大量文件。所以它应该对你有那么大的影响。
希望对您有所帮助!
-罗伯特
目标:我只想去掉逗号,因为这是唯一会搞砸我的(课程要求)文件解析以进行贝叶斯分析(即 word,2,4)而不是 say(即 word, ,2,4)
所以我目前正在尝试阅读来自 Enron public 在线语料库的文本文件形式的电子邮件,并构建贝叶斯垃圾邮件过滤器。
我注意到在尝试操作存在的字符串时,读取某些文件会引发错误。我完全知道其中一些文件包含病毒,因此某些字符的编码可能无效。但是,我试图简单地替换字符串中的逗号,但出现以下错误:
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 通过的版本进行正则表达式,但我注意到垃圾邮件的准确性受到很多垃圾邮件文件具有此类特殊字符这一事实的严重影响。
如有任何建议,我们将不胜感激。谢谢
-罗伯特
如果您只是想删除多余的逗号,而正如您所说,没有任何效果,您可以使用简单的拆分和连接(假设逗号是此处唯一的分隔符)
','.join([s for s in 'word,,2,4'.split(',') if s])
所以我最终使用了另一个我发现也很有用的实现。事实证明,出于某种原因,python 保留了它对最初存在的任何先前字符串的所有先前信息。所以我了解到将它重新分配给一个不同的(新)变量总是一个好主意,如下所示:
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
就存储数据和将数据分配给整个其他变量而言,它的成本要高一些。但是,我注意到就您的字符串而言,它不会被强制转换为 unicode 字符串,这要安全得多。最初的问题是这个输出
print words
[u'hello,',u'what?',u'is',u'going',u'on?']
'hello' 中的逗号不会被替换。使用上面的代码,您可以保证逗号将从每个单词中删除,而不是转换为 unicode 字符串
print new_array
['hello','what?',u'is',u'going',u'on?']
就代码的性能而言,我仍在以不错的速度训练大量文件。所以它应该对你有那么大的影响。
希望对您有所帮助!
-罗伯特