【问题标题】:Loop through files and save them separately循环文件并分别保存
【发布时间】:2018-08-21 07:27:20
【问题描述】:

我想在包含几千个文本文件的本地文件夹中循环,删除停用词,并将文件保存在子文件夹中。我的代码循环遍历所有文件,但将所有文本文件写入一个新文件。我需要将文件分开 - 因为它们在哪里,并且具有完全相同的文件名,只是没有停用词。我做错了什么?

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 = codecs.open(afile, encoding='utf-8')
    line = file1.read()
    words = word_tokenize(line)
    words_without_stop_words = [word for word in words if word not in stop_words]
    new_words = " ".join(words_without_stop_words).strip()
    appendFile = open('subfolder/file1.txt','w', encoding='utf-8')
    appendFile.write(new_words)
    appendFile.close()

我看到文件名将是“file1”(第 11 行) - 我无法理解 glob(如果 glob 甚至是解决方案?)。

【问题讨论】:

  • 我不明白。如果您想拥有单独的文件,那么为什么在第二个open 中使用相同的文件名,而不是使用afile 构建新文件名?

标签: python python-3.x glob


【解决方案1】:

快速解决方案:

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 = codecs.open(afile, encoding='utf-8')
    line = file1.read()
    words = word_tokenize(line)
    words_without_stop_words = [word for word in words if word not in stop_words]
    new_words = " ".join(words_without_stop_words).strip()

    subfolder = getSubfolder(afile)
    filename = getFilename(afile)
    appendFile = open('{}/{}.txt'.format(subfolder,filename),'w', encoding='utf-8')
    appendFile.write(new_words)
    appendFile.close()

我从未使用过 glob 或编解码器,我相信您的问题在于您的最后 3 行代码。您使用常量字符串('subfolder/file1.txt')作为最终文件目标 - 这就是您的结果位于一个文件中的原因。我用两个变量替换了目标路径。我从函数“getSubfolder()”和“getFilename()”中获得这些变量。您必须实现这些功能才能获得所需的文件名。

如果我理解您的目标正确,您的文件名将保持不变,只是在不同的文件夹中。然后你可以使用这一行:

    appendFile = open('{}/{}.txt'.format('mysubfolder',afile),'w', encoding='utf-8')

边学习边解决:

我建议您查看https://github.com/inducer/pudb 并按照循环的每一步执行。这样你就可以看到和了解python做了什么,什么变量在某个时间点有什么值,等等。

【讨论】:

  • 这与您的 appendFile 行配合得很好!而且我会仔细看看pudb,不知道有这么神奇的工具存在。
  • 不客气。这个工具看起来很书呆子,但对于小脚本调试来说真的很棒:)
【解决方案2】:

原因是您在循环中使用相同的名称。您应该在每次迭代中更改文件名。例如你可以试试这个:

counter = 0 # This line added
for afile in glob.glob("*.txt"):
    file1 = codecs.open(afile, encoding='utf-8')
    line = file1.read()
    words = word_tokenize(line)
    words_without_stop_words = [word for word in words if word not in stop_words]
    new_words = " ".join(words_without_stop_words).strip()
    appendFile = open('subfolder/file1' + str(counter) + ".txt",'w', encoding='utf-8') # This line changed
    appendFile.write(new_words)
    appendFile.close()
    counter += 1 # This line added

这里发生的事情是:我们添加了一个计数器变量,并将该数字添加到每个文件名称的末尾。

在循环结束时,我们增加counter 用于分隔文件。

您可以尝试不同的方法,例如在新文件名的末尾添加原始文件名。

【讨论】:

  • 那行得通。但是可以保留原始文件名吗?
  • 您是指afile 名称还是file1.txt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多