【问题标题】:Loop through files removing stop-words遍历文件删除停用词
【发布时间】:2019-01-24 06:17:30
【问题描述】:

我想从本地文件夹中的多个文件中删除停用词。我知道如何为一个文件执行此操作,但我无法为该文件夹中的所有文件执行此操作。

我尴尬的尝试:

import io
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import glob
import os
import codecs


stop_words = set(stopwords.words('english'))

for afile in glob.glob("*.txt"):
    file1 = open(afile)
    line = file1.read()
    words = word_tokenize(line)
    words_without_stop_words = ["" if word in stop_words else word for word in words]
    new_words = " ".join(words_without_stop_words).strip()
    appendFile = open('subfolder/file1.txt','w')
    appendFile.write(new_words)
    appendFile.close()

我什至不知道我能走多远,因为我明白了:

Traceback(最近一次调用最后一次): 文件“C:\Desktop\neg\sw.py”,第 14 行,在 行 = file1.read() 解码中的文件“C:\Program Files\Python36\lib\encodings\cp1252.py”,第 23 行 返回 codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError:“charmap”编解码器无法解码位置 1757 中的字节 0x9d:字符映射到 <undefined>

我尝试使用 glob,但找不到好的文档。也许没有必要?

【问题讨论】:

  • 我认为至少你应该使用open('subfolder/file1.txt','a'),因为'w'会导致你每次使用它时覆盖文件。我假设您将所有非停用词存储在同一个文件中。
  • 很高兴显示错误消息,但最好提供完整的堆栈跟踪以了解在哪一行引发了错误。而当涉及到编码问题时,您还应该说出确切的Python版本和操作系统。
  • 错误信息表明输入文件不是Unicode文件。如果没有看到错误周围的各个字节,我们就无法猜测它是什么。请参阅Stack Overflow character-encoding tag info page,了解一些疑难解答提示和有关如何发布良好、定义明确的问题的说明。
  • @SergeBallesta 更新了错误。

标签: python python-3.x


【解决方案1】:

您的文件的编码似乎错误。您需要使用正确的encoding kwarg(可能是"utf-8")调用open() 函数。当你想附加你的文件时,使用'a'。实际上,我会在处理文件之前打开附加文件,并在写入所有文件后关闭它。

当从停用词中过滤你的词时,不要将空字符串放入列表中,只需省略这些词:

words_without_stop_words = [word for word in words if word not in stop_words]
new_words = " ".join(words_without_stop_words).strip()

【讨论】:

    【解决方案2】:

    您必须在写入utf-8 的文件时添加编码格式,通常您可以使用

    appendFile = open('subfolder/file1.txt','w', encoding='utf-8')
    appendFile.write(new_words)
    appendFile.close()
    

    您必须将数据附加到文件中,以便将所有数据存储到单个文件中,而不是将数据写入文件。

    您也可以使用编解码器来插入文件,例如

    f = codecs.open(filename, encoding="utf-8")
    

    并插入数据。

    【讨论】:

      【解决方案3】:

      从完整的堆栈跟踪中,您使用的是具有西欧语言和默认 Ansi 代码页 1252 的 Windows 系统。

      您的一个文件包含一个 0x9d 字节。在读取时,Python 尝试将文件字节解码为 un​​icode 字符串并失败,因为 0x9d 不是有效的 CP1252 字节,因此出现错误。

      可以做什么?

      正确的方法是识别有问题的文件并尝试识别它的真实编码。一种简单的方法是显示其名称:

      for afile in glob.glob("*.txt"):
          with open(afile) as file1:
              try:
                  line = file1.read()
              except UnicodeDecodeError as e:
                  print("Wrong encoding file", afile, e)       # display file name and error
                  continue                                     # skip to next file
          ...
      

      或者,如果错误只发生在几个文件的几个单词中,您可以简单地忽略或替换有问题的字节:

      for afile in glob.glob("*.txt"):
          with open(afile, errors = "replace") as file1:
              line = file1.read()
          ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 2010-11-25
        • 2019-01-21
        • 2011-07-07
        相关资源
        最近更新 更多