我有两个不同目录中的文件,其中包含索引文本的pickle列表,如下所示,以.out格式保存:
(LP0 S' TCCTCTTGGAGCACCAGCTAATATTTCATCAGTATTCGCTGAATCTTCGGACATAGTTCA' P1 作为' TTCGGACATAGTTCATTCATATTTATTTGCCCAATACCCGCACGAAGAAGCCTTGCAGAC' P2 作为' AGAAGCCTTGCAGACACCGTGGCA' P3 一个。
我要完成的任务是从可疑文本目录中打开一个文件,并将其与源文本目录中的每个文件进行比较,使用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,因为我故意将匹配的索引文本添加到系统文本中。
答案 0 :(得分:2)
你的函数get_source_files
和get_suspect_files
都包含循环,但是在循环的第一次迭代中返回。这就是为什么你的程序只查看每个列表中的第一个文件。
此外,这两个函数中的循环由main函数中的循环复制。在你的main函数中,你永远不会使用循环变量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()
请注意,这会在每次迭代中重复加载源文本。如果这很慢,并且文本不会太长而无法存储在内存中,则可以将所有源文本和可疑文本存储在列表中。