Python:打印时需要字节类型对象,而不是字符串

3
问题 / 我的尝试
我下载了 textmining 1.0 库并尝试运行它,但是出现了一些导入错误(因为这是一个 Python 2 的库)。于是我在 Stack Overflow 上搜索后发现我需要使用 2to3.py,现在一切都能正常工作了。但是当我执行以下操作时:
def buildMatrix(self,document_list):
        print("building matrix...")
        tdm = textmining.TermDocumentMatrix()
        for doc in document_list:
             tdm.add_doc(doc)
        tdm.write_csv(r'path\matrix.csv', cutoff=2)

(document_list只是一个字符串列表) 我得到了以下错误:
  File "C:\Users\RICK\Anaconda\lib\site-packages\textmining\__init__.py", line 335, in write_csv
    f.writerow(row)

TypeError: a bytes-like object is required, not 'str'

在检查 textmining 1.0 代码时,我相当确定该行应该是一个字符串(string)。因此,我想通过编辑源代码来打印这一行:

f = csv.writer(open(filename, 'wb'))
        for row in self.rows(cutoff=cutoff):
            print(row)
            f.writerow(row)

然而,即使现在我仍然遇到相同的 "TypeError" 错误:
  File "C:\Users\RICK\Anaconda\lib\site-packages\textmining\__init__.py", line 335, in write_csv
    print(row)

TypeError: a bytes-like object is required, not 'str'

我在Stack Overflow上搜索了解决方法,通过将'wb'替换为'w'来解决问题,但是仍然出现TypeError

问题:

  • 如何修改代码使其能够写入行。
  • 即使print语句也会导致TypeError的原因是什么?

基于评论的编辑建议:
Claudio的建议仍然给我带来了TypeError

  File "C:\Users\RICK\Anaconda\lib\site-packages\textmining\__init__.py", line 335, in write_csv
    f.write(row)

TypeError: a bytes-like object is required, not 'str'

Tony的建议:
代码检查:

for article in articles:
        abstract = searcher.getArticleAbstract(article)
        print(type(abstract)) #--> returns <class 'str'>
        all_abstracts.append(abstract)
    txtSearcher.buildMatrix(all_abstracts)

我现在有这些开放的代码行:

f = open(os.path.join(data_dir, 'stopwords.txt'),"r")
f = open(os.path.join(data_dir, 'dictionary.txt'),"r")
f = csv.writer(open(filename, 'w'))

一些奇怪的事情正在发生

enter image description here 这将带我去:

def write_csv(self, filename, cutoff=2):
        print("This really makes me sad!")

        """
        Write term-document matrix to a CSV file.

        filename is the name of the output file (e.g. 'mymatrix.csv').
        cutoff is an integer that specifies only words which appear in
        'cutoff' or more documents should be written out as columns in
        the matrix.

        """
        print(self.rows)
        f = csv.writer(open(filename, 'w'))
        for row in self.rows(cutoff=cutoff):
            f.writerow(row)

它确实打印了“building matrix…”(因此该函数被调用),但它没有打印print("This really makes me sad!")


在Python 3中,您应该使用文本模式与csv writer一起使用,以及newline=''。至于为什么print()会给出相同的错误,可能是被某些东西遮蔽了吗? - Ilja Everilä
2个回答

0
据我目前的了解,导致程序出现奇怪行为的实际原因是我在评论中提出的问题没有被认为是相关的和唯一正确的答案来解释所有观察到的问题。
所有其他检测到的问题,例如将def write_csv(...)重命名为例如def my_write_csv(...),包括提供的说明和提示,例如:如果您定义了一个与库中函数同名的自定义函数,则会遇到本地/全局范围的问题,并且很难知道哪个实际上被执行?这个来自库还是你定义的这个...你插入的print("This really makes me sad!")未打印的事实表明并非执行了此函数,而是执行了库函数...
检查整个代码,包括要读取的文件或可重现错误的摘录-肯定有一个非常简单的解释来解释这种奇怪的行为。
在指示错误的行之前的代码中查找未关闭的括号、字符串引号或列表]等。

在这种情况下无法成功...


它仍然会给出相同的错误(请参见我的问题编辑)。 - CodeNoob
发布或提供整个代码...问题的原因不在你看的地方...也许你正在运行错误的文件??? - Claudio
一个 csv 写入对象是否有一个名为 write() 的方法呢? - Ilja Everilä
你确定你正在编辑的代码中出现了错误吗?print(dir(row))也是吗? - Claudio
如果我将其更改为my_write_csv并使用“转到定义”,它会将我带到编辑后的函数,但运行代码会给出“'TermDocumentMatrix'对象没有属性'my_write_csv'”的错误提示。 - CodeNoob
谢谢,我解决了。我使用了 imp.reload() 并按照 Tony 的描述编辑了代码。 - CodeNoob

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接