Python for循环遍历目录文件

Python for循环遍历目录文件,python,loops,python-2.7,Python,Loops,Python 2.7,我有两个不同目录中的文件,其中包含索引文本的pickle列表,如下所示,以.out格式保存: (lp0 S'TCTCTTGGAGCACCAGCTATATTTTCAGATTCAGATTCGCCTGAATTCTTCGGACATAGTTCA' p1 如“TTCGGACATAGTTCTCATTTTATTTGCCCATACCGCACGAGAGAGAGACTTCCATCCAGAC” p2 作为“AGAGACCTTGCAGACACCGTGGCA” p3 a 我试图完成的任务是从可疑文本目录中打开一个文件,并使

我有两个不同目录中的文件,其中包含索引文本的pickle列表,如下所示,以.out格式保存:

(lp0 S'TCTCTTGGAGCACCAGCTATATTTTCAGATTCAGATTCGCCTGAATTCTTCGGACATAGTTCA' p1 如“TTCGGACATAGTTCTCATTTTATTTGCCCATACCGCACGAGAGAGAGACTTCCATCCAGAC” p2 作为“AGAGACCTTGCAGACACCGTGGCA” p3 a

我试图完成的任务是从可疑文本目录中打开一个文件,并使用python的difflib将其与源文本目录中的每个文件进行比较,打印出一个数字,指示它们是否匹配,然后对可疑文本目录中的其余文件执行相同的操作。(旁注:如果有人知道比较这两个索引文本列表的更详细的方法,我洗耳恭听,但这远不是重点。)

我当前的问题是for循环无法完成此任务。我的意思是,我可以循环遍历文件夹,他们可以打印出文件夹名称,但文件本身的内容不会更改。循环当前只对每个目录中的一个文件进行多次比较,我不知道如何修复它。

欢迎提出任何建议,如果我的解释足够清楚,请随时提问

谢谢。另外,我知道这是一个常见的问题,我已经尽了最大的努力查看以前的答案并应用它们,但我很难做到这一点,因为我不太擅长编程

提前谢谢

F

代码如下:

import string
import pickle
import sys
import glob
import difflib


sourcePath = 'C:\Users\User\Sou2/*.out'
suspectPath = 'C:\Users\User\Susp2/*.out'
list_of_source_files = glob.glob(sourcePath)
list_of_suspect_files = glob.glob(suspectPath)


def get_source_files(list_of_source_files):

    for source_file_name in list_of_source_files:
        with open(source_file_name) as source_file:
            sourceText = pickle.load(source_file)
        return sourceText


get_suspect_files(list_of_suspect_files):

    for suspect_file_name in list_of_suspect_files:
        with open(suspect_file_name) as suspect_file:
            suspectText = pickle.load(suspect_file)
        return suspectText


def matching(sourceText,suspectText):

            matching = difflib.SequenceMatcher(None,sourceText,suspectText)
            print matching.ratio()


def main():

    for suspectItem in list_of_suspect_files:
        suspectText = get_suspect_files(list_of_suspect_files)
        print ('----------------SEPERATOR-----------------')
        for sourceItem in list_of_source_files:
            sourceText = get_source_files(list_of_source_files)
            matching(sourceText,suspectText)


main()
当前结果:

----------------SEPERATOR-----------------
0.0
0.0
0.0
----------------SEPERATOR-----------------
0.0
0.0
0.0
----------------SEPERATOR-----------------
0.0
0.0
0.0
----------------SEPERATOR-----------------
0.0
0.0
0.0

对于其中一些,这应该是1.0,因为我有意将匹配的索引文本放入系统中。

您的函数
get\u source\u files
get\u suspect\u files
都包含循环,但在循环的第一次迭代中返回。因此,您的程序只查看每个列表中的第一个文件

此外,这两个函数中的循环被主函数中的循环复制。在主函数中,您从不使用循环变量
suspectItem
sourceItem
,因此这些循环只会多次执行相同的操作

您可能混淆了
yield
return
,并以某种方式期望您的函数像生成器一样工作

像这样的东西应该有用

def get_text(file_name):
    with open(file_name) as file:
        return pickle.load(file)

def matching(sourceText,suspectText):
    matching = difflib.SequenceMatcher(None,sourceText,suspectText)
    print matching.ratio()

def main():
    for suspect_file in list_of_suspect_files:
        print ('----------------SEPERATOR-----------------')
        suspect_text = get_text(suspect_file)
        for source_file in list_of_source_files:
            source_text = get_text(source_file)
            matching(source_text, suspect_text)

main()

请注意,这会在每次迭代中重复加载源文本。如果加载速度慢,并且文本不太长,无法放入内存,则可以将所有源文本和可疑文本存储在列表中。

谢谢您的更新Kevin!非常感谢您,这已经奏效了!我很高兴我可以哭了,因为我的头撞了这个2D现在…谢谢你,斯图尔特!这必须是有效的,而且用于比较的文件非常大,所以这将是完成任务的更好方式,谢谢!