我对python还很陌生。对于此任务,我尝试导入一个文本文件,将和添加到id中,并从文本中删除标点符号。我试过这个方法如何从文本文件中删除标点符号。
import string
def readFile():
translate_table = dict((ord(char), None) for char in string.punctuation)
with open('out_file.txt', 'w') as out_file:
with open('moviereview.txt') as file:
for line in file:
line = ' '.join(line.split(' '))
line = line.translate(translate_table)
out_file.write("<s>" + line.rstrip('n') + "</s>" + 'n')
return out_file
然而,我得到一个错误说:
TypeError:应为字符串或其他字符缓冲区对象
我的想法是,在我拆分并连接行之后,我会得到一个字符串列表,所以我不能使用str.translate()来处理它。但似乎其他人都有相同的东西,而且它很有效,前任。https://appliedmachinelearning.blog/2017/04/30/language-identification-from-texts-using-bi-gram-model-pythonnltk/在第13行的示例代码中。
所以我真的很困惑,有人能帮忙吗?谢谢
在Python 2中,只有unicode
类型具有采用dict
的translate
方法。如果您打算使用任意文本,这里最简单的解决方案就是在Py2上使用Python3版本的open
;它将无缝地解码您的输入并产生CCD_ 5而不是CCD_。
从Python2.6+开始,用Python3版本替换普通的内置open
非常简单。只需添加:
from io import open
到文件顶部的导入。您也可以删除line = ' '.join(line.split(' '))
;从定义上讲,这是一个无操作(它在单个空间上拆分以生成list
,然后在单个空间重新连接)。您可能还想添加:
from __future__ import unicode_literals
到文件的顶部(在所有代码之前);这将使您对纯引号的所有使用自动成为unicode
文字,而不是str
文字(在实际的二进制数据前面加上b
,使其在Py2上成为str
文字,在Py3上为bytes
文字)。
上面的解决方案是最好的,如果你能摆动它,因为它将使你的代码在Python 2和Python 3上都能正确工作。如果由于任何原因无法执行,则需要更改translate
调用以使用API Python 2的str.translate
预期,这意味着完全删除translate_table
的定义(不需要),只执行:
line = line.translate(None, string.punctuation)
对于Python 2的str.translate
,参数是一对一映射表,用于0到255(包括0到255)的所有值作为第一个参数(如果不需要映射,则为None
),第二个参数是要删除的字符串(string.punctuation
已经提供)。
在这里回答,因为注释不能使我正确格式化代码:
def r():
translate_table = dict((ord(char), None) for char in string.punctuation)
a = []
with open('out.txt', 'w') as of:
with open('test.txt' ,'r') as f:
for l in f:
l = l.translate(translate_table)
a.append(l)
of.write(l)
return a
这段代码对我来说运行良好,没有任何错误。你能试着运行它,并用你运行的代码的屏幕截图来回应吗?