您可以像这样枚举目录中的文件:
import glob
for file in glob.glob('*.txt'): #choose files will be found in this case anything.txt
with open(file) as f:
#code...
可以在此处找到有关 glob 的文档:Glob PyDoc
您可能想要浏览所有文件并构建所有短语的记录。尽管您需要跟踪哪些短语来自何处,因为在第二遍检查短语的文件中,在第二遍中记录在第一遍中的短语将在同一文件中找到。您需要一种仅查找来自其他文件的短语的方法。
此代码将创建名为 badphrases_.txt 的文件,其中包含短语列表:
import glob
import itertools
for file in list(glob.glob('*.txt')):
with open(file) as f:
with open('badphrases_%s' % file,'w+') as bad_list:
text = f.read().split() #get all the words
bad_list.write('\n'.join(( ' '.join(text[i:i+6]) for i in range(0,len(text)-5,1) )))
例如,如果“b.txt”包含“我吃了一个土豆,很好吃”。生成的文件将包含:
I ate a potato and it
ate a potato and it was
a potato and it was good.
从这里,您可能想要删除标点符号。从这一点开始,您只需要检查每个文件的任何 badphrases_name.txt 文件的内容,其中 name != 正在检查的文件的当前名称。
解释
for file in list(glob.glob('*.txt')):
是一个通用的 for 循环,它遍历结果中包含的所有值
list(glob.glob('*.txt'))
for 循环的语法是Python Doc
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
在这种情况下,target_list 是 'file',expression_list 是list(glob.glob('*.txt')
. else/suite 部分是一个可选结构,如果 for 循环未在其代码套件内终止,则将执行代码块“套件”。例如
for i in range(10):
pass
else:
print("No errors!")
产量:
>>>
No errors!
尽管
for i in range(10):
break
else:
print("No errors!")
不会进入else
子句,因此不会打印任何内容。
现在,在glob.glob('*.txt')
做什么?模块“glob”中的这个方法将查找目录中与模式匹配的所有文件,在本例中为:*.txt(* 代表任何内容)。我们将其转换为列表的原因list()
是它glob.glob()
是一个生成器。而且由于我们在循环中创建了一个文件,glob.glob
所以稍后会选择它。IE
- 打开文件
a.txt
- 制作文件
bad_phrases_a.txt
glob.glob
然后可能会回来bad_phrases_a.txt
- 制作文件
bad_phrases_bad_phrases_a.txt
如您所见,此过程将导致无限递归,因此我们希望在开始创建 *bad_phrases* 文本文件之前耗尽生成器。list()
将获取所有值glob.glob('*.txt')
返回并将它们放在一个列表中,如下所示['a.txt','b.txt','c.txt']
:然后我们使用 for 循环依次检查每一个。
with open(file) as f:
此代码打开当前存储路径的文本文件file
(来自 for 循环)并将其分配给变量f
. 我们使用 f 将文本写入 .txt 文件本身。with语法是一种结构,在这种情况下,一旦我们完成它就会关闭文件。你可以在这里阅读更多关于 with 语法的信息With Python Doc。
with open('badphrases_%s' % file,'w+') as bad_list:
与上面类似,我们打开一个文件为 bad__list。'badphrases_%s' % file
是字符串替换。它将 之后的值按顺序%
放置在它之前的字符串中。在这种情况下,代表我们当前正在查看的文件的名称。file
text = f.read().split()
f.read()
将内容从文件中提取到内存中,并将其存储为字符串。该.split()
方法创建文件中所有单词的列表,即:['ate','there',...]
.
bad_list.write('\n'.join(( ' '.join(text[i:i+6]) for i in range(0,len(text)-5,1) )))
上面的主要部分是这一切发生的地方。write()
将文本输出到文件。对外工作:
( ' '.join(text[i:i+6]) for i in range(0,len(text)-5,1) )
是一个生成器表达式。它类似于列表理解,即:
[x for x in range(5)]
会产生[0,1,2,3,4]
. 该join()
方法采用一个可迭代对象并将内容连接在一起,并且在每个元素之间放置一个字符,因此'*'.join(['a','b','c']) == "a*b*c"
. 在这种情况下,我们要选择六个单词text[i:i+6]
并将它们组合成一个字符串,其中每个单词用空格分隔' '
。我们对 i 的值从 0 到文本中的单词数 - 5 执行此操作,并且在每一步我们将 i 增加 1。
这将创建一个我们要打印到文件的行列表。所以我们使用'\n'.join(...)
将每一行组合成一个字符串,其中每一行由换行符分隔(由'\n'表示)。