Python TypeError: expected a string or other character buffer object when importing text file

Python TypeError: expected a string or other character buffer object when importing text file

我是 python 的新手。对于此任务,我尝试导入一个文本文件,将 添加到 id,并从文本中删除标点符号。我试过这个方法How to strip punctuation from a text file

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: expected a string or other character buffer object

我的想法是,在我拆分并加入该行后,我得到了一个字符串列表,所以我不能使用str.translate()来处理它。但似乎其他人都有同样的东西并且有效, 前任。 https://appliedmachinelearning.blog/2017/04/30/language-identification-from-texts-using-bi-gram-model-pythonnltk/ 在第 13 行的示例代码中。

所以我真的很困惑,有人可以帮忙吗?谢谢!

在这里回答是因为评论不允许我正确格式化代码:

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

这段代码对我来说运行良好,没有错误。你能试试 运行 吗,并用你 运行 的代码截图作为回应?

在 Python 2 上,只有 unicode 类型具有采用 dicttranslate 方法。如果您打算使用任意文本,这里最简单的解决方案是在 Py2 上使用 Python 3 版本的 open;它将无缝解码您的输入并生成 unicode 而不是 str.

从 Python 2.6+ 开始,用 Python 3 版本替换普通的内置 open 很简单。只需添加:

from io import open

到文件顶部的导入。您也可以删除 line = ' '.join(line.split(' '));这在定义上是一个空操作(它在单个空格上拆分成 list,然后在单个空格上重新加入)。您可能还想添加:

from __future__ import unicode_literals

the very top of your file(在你的代码的所有之前);这将使您对普通引号的所有使用自动 unicode 文字,而不是 str 文字(使用 b 前缀实际二进制数据,使其成为 Py2 上的 str 文字,bytes Py3 上的文字)。

上面的解决方案是最好的,如果你可以摆动它,因为它会使你的代码在 Python 2 和 Python 3 上都能正常工作。如果你因为任何原因不能这样做,那么您需要更改 translate 调用以使用 API Python 2's str.translate 预期,这意味着完全删除 translate_table 的定义(不需要)并只做:

line = line.translate(None, string.punctuation)

对于 Python 2 的 str.translate,参数是一个一对一的映射 table 作为第一个参数(None 如果不需要映射),第二个参数是要删除的字符串(string.punctuation 已经提供)。