【问题标题】:Iterating Through a Folder of Files遍历文件文件夹
【发布时间】:2013-04-26 00:58:33
【问题描述】:

我在我大学的一位教授的办公室工作,他让我通读整个班级的论文,试图抓住抄袭的人,所以我决定使用 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)

我能够为文件夹中的单个文件创建所有六个单词短语,但对于如何对文件夹中的每个文件执行此操作以及如何比较它们感到困惑。非常感谢任何和所有帮助,并感谢第一学期的计算机科学专业。

【问题讨论】:

    标签: python file loops directory


    【解决方案1】:

    您可以像这样枚举目录中的文件:

    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 是“文件”,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 稍后会获取它。即

    1. 打开文件a.txt
    2. 制作文件bad_phrases_a.txt
    3. glob.glob 可能会返回 bad_phrases_a.txt
    4. 制作文件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 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() 方法采用一个可迭代对象并将内容连接在一起,并且在每个元素之间放置一个字符,因此 '*'.join(['a','b','c']) == "a*b*c"。在这种情况下,我们要选择六个单词text[i:i+6] 并将它们组合成一个字符串,其中每个单词用空格' ' 分隔。我们对 i 的值执行此操作,从 0 到文本中的单词数 - 5,并且在每一步我们将 i 递增 1。

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

    【讨论】:

    • 对于教授给我的文件夹中的每个文件,是否可以运行我的程序来查找所有短语,然后创建这些短语的文件以放入新文件夹中?就像给定 25 篇论文一样,找到每篇论文的短语,并为每篇论文创建一个短语列表文件,并将该文件放在一个新文件夹中,这样最后你会有一个包含 25 个单词短语文件的新文件夹?
    • 是的,正如我们所说,我正在努力解决这个问题。我主要担心的是,在 25 篇论文中,查看 6 长的短语,然后计算出每个短语的组合,会增加大量的短语。该程序将需要很长时间才能运行。您想引入任何约束吗?我很高兴尝试解决问题。
    • 对不起,我误解了你的要求,我现在明白你想要的只是从开头开始的所有 6 个单词长的片段。
    • 抱歉,我应该让事情更清楚!感谢所有的帮助,我真的很感激
    • 很抱歉,我不完全理解您的解决方案。您是否有可能向我展示一种将其实现到我当前代码中的方法?抱歉,我是 Python 新手。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2023-01-20
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多