通过文件夹迭代

时间:2013-04-26 00:58:33

标签: python file loops directory

我在我大学的一位教授的办公室工作,他指派我阅读整篇班级论文,试图捕捉剽窃的人,所以我决定用python编写一个程序来查看所有的所有论文中的六个单词短语,并将它们进行比较,以查看是否有任何论文有超过200个匹配短语。六个单词短语将是例如......

我吃了一个土豆,这很好。会:

我吃了一个土豆,它

吃了一个土豆,它是

马铃薯很好吃。

我的代码是正确的

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)

我能够为文件夹中的单个文件创建所有六个单词短语,但是对于如何对文件夹中的每个文件以及如何比较它们感到困惑。任何和所有的帮助都非常感谢,并感谢第一学期的Comp Science专业。

1 个答案:

答案 0 :(得分:0)

您可以枚举目录中的文件,如下所示:

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')):

是循环的通用,遍历

结果中包含的所有值
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循环未在其代码套件中终止,则将执行代码块'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将在以后进行修改。即

  1. 打开文件a.txt
  2. 制作档案bad_phrases_a.txt
  3. glob.glob可能会返回bad_phrases_a.txt
  4. 制作档案bad_phrases_bad_phrases_a.txt
  5. 正如您所看到的,此过程将导致无限递归,因此我们希望在开始创建* 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 Python Doc了解有关with语法的更多信息。

    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()方法采用iterable并将内容连接在一起,每个元素之间放置一个字符,所以'*'.join(['a','b','c']) == "a*b*c"。在这种情况下,我们要选择六个单词text[i:i+6]并将它们组合成一个字符串,其中每个单词用空格' '分隔。我们对i的值从0开始,直到文本中的单词数为5,在每一步我们将i递增1.

    这会创建我们要打印到文件的行列表。因此我们使用'\n'.join(...)将每一行组合成一个字符串,其中每一行用换行符分隔(由'\ n'表示)。