Python TypeError:导入文本文件时应为字符串或其他字符缓冲区对象



我对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类型具有采用dicttranslate方法。如果您打算使用任意文本,这里最简单的解决方案就是在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

这段代码对我来说运行良好,没有任何错误。你能试着运行它,并用你运行的代码的屏幕截图来回应吗?

相关内容

最新更新