Python 在文件文件夹中迭代
我在学院一位教授的办公室工作,他让我通读一整堂课的论文,试图抓住剽窃者,所以我决定用python编写一个程序,查看所有论文中的六个单词短语,并对它们进行比较,看看是否有任何一篇论文有超过200个匹配的短语。例如,六个单词的短语是 我吃了一个土豆,味道很好。应该是: 我吃了一个土豆,吃了它 吃了一个土豆,它是 一个土豆,很好吃 我的代码是正确的Python 在文件文件夹中迭代,python,file,loops,directory,Python,File,Loops,Directory,我在学院一位教授的办公室工作,他让我通读一整堂课的论文,试图抓住剽窃者,所以我决定用python编写一个程序,查看所有论文中的六个单词短语,并对它们进行比较,看看是否有任何一篇论文有超过200个匹配的短语。例如,六个单词的短语是 我吃了一个土豆,味道很好。应该是: 我吃了一个土豆,吃了它 吃了一个土豆,它是 一个土豆,很好吃 我的代码是正确的 import re def ReadFile(Filename): try: F = open(Filename)
import re
def ReadFile(Filename):
try:
F = open(Filename)
F2=F.read()
except IOError:
print("Can't open file:",Filename)
return []
F3=re.sub("[^a-z ]","",F2.lower())
return F3
def listEm(BigString):
list1=[]
list1.extend(BigString.split(' '))
return list1
Name = input ('Name of file? ')
Words = ReadFile(Name)
Words2= listEm(Words)
index1=0
index2=6
new_list=[]
while index2 <= len(Words2):
new_list.append(Words2[index1:index2])
index1 += 1
index2 +=1
print (new_list)
重新导入
def ReadFile(文件名):
尝试:
F=打开(文件名)
F2=F.读取()
除IOError外:
打印(“无法打开文件:”,文件名)
返回[]
F3=re.sub(“[^a-z]”,“”,F2.lower())
返回F3
def listEm(大字符串):
列表1=[]
列表1.extend(BigString.split(“”))
返回列表1
Name=input('文件名?')
Words=ReadFile(名称)
Words2=listEm(单词)
index1=0
index2=6
新列表=[]
当index2时,您可以枚举目录中的文件,如下所示:
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的文档可在此处找到:
您可能希望浏览所有文件并构建所有短语的记录。尽管您需要跟踪哪些短语来自何处,因为在第二次通过文件检查短语时,第一次通过记录的短语将在第二次通过时的同一文件中找到。您需要一种只查找来自其他文件的短语的方法
此代码将创建名为badshages_uu.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.
从这里,您可能需要删除标点符号。从这一点开始,您只需检查每个文件中的任何不良短语的内容,其中name!=正在检查的文件的当前名称
解释
for file in list(glob.glob('*.txt')):
是泛型for循环,它遍历的结果中包含的所有值
list(glob.glob('*.txt'))
for循环的语法是
在这种情况下,目标列表是'file',表达式列表是list(glob.glob('*.txt')
。else/suite部分是可选的构造,
如果for循环未在其代码套件中终止,则将执行代码块“suite”
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
稍后将获取它
打开文件a.txt
制作文件bad\u短语\u a.txt
glob.glob
然后可能返回bad\u短语\u a.txt
将文件bad\u短语\u bad\u短语\u a.txt
正如您所见,此过程将导致无限递归,因此我们希望在开始创建*坏短语*文本文件之前耗尽生成器。list()
将获取所有值glob.glob('*.txt')
返回值,并将它们放入如下列表中:['a.txt','b.txt','c.txt']
。然后,我们使用for循环按顺序检查每个循环
打开(文件)作为f:
此代码打开当前文本文件,其路径存储在file
(从for循环)中,并将其分配给变量f
。我们使用f将文本写入.txt文件本身。with语法是一种构造,在这种情况下,一旦我们完成with语法,它将关闭文件。您可以在此处阅读有关with语法的更多信息
与上面类似,我们将文件作为坏列表打开。'badshages\uuu%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代表范围(5)]
将产生[0,1,2,3,4]
。join()
方法使用一个iterable并将内容连接在一起,每个元素之间放置一个字符,因此'*'。join(['a','b','c'])==“a*b*c”
。在这种情况下,我们要选择六个单词文本[i:i+6]
并将它们组合成一个字符串,其中每个单词由一个空格分隔。
”。我们这样做是为了i的值从0到文本中的单词数-5,并且在每一步中,我们将i增加1
这将创建一个要打印到文件中的行列表。因此,我们使用
'\n'.join(…)
将每一行组合成一个字符串,其中每一行由新行分隔(由'\n'表示).对于教授给我的文件夹中的每个文件,是否可以运行我的程序来查找所有短语,然后创建一个包含这些短语的文件以放入新文件夹?就像给定的25篇论文一样,查找每篇论文的短语,并为每篇论文创建一个包含短语列表的文件并将该文件放入新文件夹中,以便在你会有一个包含25个单词短语文件的新文件夹吗?是的,我正在研究解决这个问题的方法。我主要关心的是有25篇论文,看6个长的短语,然后计算出组合
bad_list.write('\n'.join(( ' '.join(text[i:i+6]) for i in range(0,len(text)-5,1) )))
( ' '.join(text[i:i+6]) for i in range(0,len(text)-5,1) )