4
from glob import glob
pattern = "D:\\report\\shakeall\\*.txt"
filelist = glob(pattern)
def countwords(fp):
    with open(fp) as fh:
        return len(fh.read().split())
print "There are" ,sum(map(countwords, filelist)), "words in the files. " "From directory",pattern
import os
uniquewords = set([])
for root, dirs, files in os.walk("D:\\report\\shakeall"):
    for name in files:
        [uniquewords.add(x) for x in open(os.path.join(root,name)).read().split()]
print "There are" ,len(uniquewords), "unique words in the files." "From directory", pattern

到目前为止,我的代码是这样的。这会计算唯一词的数量和总词数D:\report\shakeall\*.txt

问题是,例如,此代码识别code code.code!不同的单词。因此,这不能作为唯一单词的确切数量的答案。

我想使用 Windows 文本编辑器从 42 个文本文件中删除特殊字符

或者制定一个例外规则来解决这个问题。

如果使用后者,我应该如何编写我的代码?

让它直接修改文本文件?或者做一个不计算特殊字符的例外?

4

3 回答 3

9
import re
string = open('a.txt').read()
new_str = re.sub('[^a-zA-Z0-9\n\.]', ' ', string)
open('b.txt', 'w').write(new_str)

它将每个非字母数字字符更改为空白。

于 2012-08-10T12:57:21.113 回答
2

我很新,我怀疑这是否非常优雅,但一种选择是在读入字符串并通过 string.translate() 运行它们以去除标点符号后获取您的字符串。这是2.7 版的 Python 文档(我认为您正在使用)。

就实际代码而言,它可能是这样的(但也许比我更好的人可以确认/改进它):

fileString.translate(None, string.punctuation)

其中“fileString”是您的 open(fp) 读入的字符串。“None”用于代替翻译表(通常用于将某些字符实际更改为其他字符),以及第二个参数 string.punctuation (一个包含所有标点符号的 Python 字符串常量)是一组将从字符串中删除的字符。

如果上述方法不起作用,您可以进行如下修改:

inChars = string.punctuation
outChars = ['']*32
tranlateTable = maketrans(inChars, outChars)
fileString.translate(tranlateTable)

我通过快速搜索找到了一些其他类似问题的答案。我也会把它们链接在这里,以防你能从他们那里得到更多。

从 Python 列表项中删除标点符号

从字符串中删除所有特殊字符、标点符号和空格

在 Python 2.x 中去除特定标点符号


最后,如果我所说的完全错误,请发表评论,我会将其删除,以免其他人尝试我所说的并感到沮丧。

于 2012-08-10T13:22:37.563 回答
0
import re

然后更换

[uniquewords.add(x) for x in open(os.path.join(root,name)).read().split()]

经过

[uniquewords.add(re.sub('[^a-zA-Z0-9]*$', '', x) for x in open(os.path.join(root,name)).read().split()]

这将在将每个单词添加到集合之前从每个单词中去除所有尾随的非字母数字字符。

于 2012-08-10T13:03:56.193 回答