Python 循环文件删除停止字

Python 循环文件删除停止字,python,python-3.x,Python,Python 3.x,我想从本地文件夹中的多个文件中删除停止字。我知道如何处理一个文件,但我无法专心处理该文件夹中的所有文件 我尴尬地尝试: 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

我想从本地文件夹中的多个文件中删除停止字。我知道如何处理一个文件,但我无法专心处理该文件夹中的所有文件

我尴尬地尝试:

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()
我甚至不知道我能走多远,因为我得到:

回溯(最近一次呼叫最后一次): 文件“C:\Desktop\neg\sw.py”,第14行,在 line=file1.read() 文件“C:\Program Files\Python36\lib\encodings\cp1252.py”,第23行,解码 返回编解码器.charmap\u解码(输入、自身错误、解码表)[0] UnicodeDecodeError:“charmap”编解码器无法对1757位置的字节0x9d进行解码:字符映射到


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

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

从stopwords筛选单词时,不要将空字符串放入列表中,只需忽略这些单词:

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

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

从stopwords筛选单词时,不要将空字符串放入列表中,只需忽略这些单词:

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

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

appendFile = open('subfolder/file1.txt','w', encoding='utf-8')
appendFile.write(new_words)
appendFile.close()
您必须将数据附加到文件中,以便所有数据都存储到单个文件中,而不是将数据写入文件中

您还可以使用编解码器插入文件,如

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

然后插入数据。

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

appendFile = open('subfolder/file1.txt','w', encoding='utf-8')
appendFile.write(new_words)
appendFile.close()
您必须将数据附加到文件中,以便所有数据都存储到单个文件中,而不是将数据写入文件中

您还可以使用编解码器插入文件,如

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

然后插入数据。

从完整的stacktrace中,您使用的是带有西欧语言和默认Ansi代码页1252的Windows系统

您的一个文件包含一个0x9d字节。在读取时,Python尝试将文件字节解码为unicode字符串,但由于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()
    ...

在完整的stacktrace中,您使用的是带有西欧语言和默认Ansi代码页1252的Windows系统

您的一个文件包含一个0x9d字节。在读取时,Python尝试将文件字节解码为unicode字符串,但由于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()
    ...

我认为至少应该使用
open('subfolder/file1.txt','a')
,因为每次使用“w”都会导致覆盖文件。我假设您正在同一个文件中存储所有不间断的字。显示错误消息很好,但最好给出完整的stacktrace,以了解在哪一行引发了错误。当谈到编码问题时,您还应该说明Python的确切版本和操作系统。错误消息表明输入文件不是Unicode文件。如果没有看到错误周围的单个字节,我们无法猜测它是什么。有关如何发布一个好的、定义明确的问题的疑难解答提示和说明,请参阅。@SergeBallesta更新了错误。我认为至少应该使用
open('subfolder/file1.txt','a')
,因为每次使用“w”都会导致覆盖该文件。我假设您正在同一个文件中存储所有不间断的字。显示错误消息很好,但最好给出完整的stacktrace,以了解在哪一行引发了错误。当谈到编码问题时,您还应该说明Python的确切版本和操作系统。错误消息表明输入文件不是Unicode文件。如果没有看到错误周围的单个字节,我们无法猜测它是什么。有关如何发布一个好的、定义明确的问题的一些疑难解答提示和说明,请参阅。@SergeBallesta更新了错误。