比较os.listdir中的两个项是否相似?

时间:2013-05-21 08:08:27

标签: python loops

忽略此问题。这与我需要提出的实际问题完全不同。对于已回答问题的人,我很抱歉。但是,希望这将有助于未来的人。

在此处阅读新主题:Opening files found from os.listdir() and comparing lines inside?

基本上,我正在运行os.listdir()来获取文件列表,然后尝试比较两个不同的文件是否具有相似的名称。我该怎么做呢?

基本上,代码目前是这样的:

config_dir = "/etc/netctl/"

profiles = os.listdir(config_dir)
for i in profiles:
    if os.path.isfile(config_dir + i):
        if i in i:
            print "True"
    else:
        pass
但是,我不确定我会用什么来检查名字中的相似之处。但是,我知道“如果我在我身边”只是检查同一个词...但我不知道如何保存最后一个......

我也尝试过:

i2 = ""
profiles = os.listdir(config_dir)
for i in profiles:
    if os.path.isfile(config_dir + i):
        if i2 == "":
            i2 = i
            print i2
        elif i2 == i:
            continue
        if i2 in i:
            print "true"
    else:
        pass
但是,我认为我可能会过度思考这一点。这是os.listdir的输出:

['hooks', 'interfaces', 'examples', 'ddwrt', 'MomAndKids_wifiz', 'backups', 'MomAndKids']

文件是ddwrt MomAndKids_wifiz和MomAndKids。基本上,我希望它检测名称“MomAndKids”和“MomAndKids_wifiz”是相似的,然后返回True。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

from difflib import SequenceMatcher
from glob import glob
from os import path

config_dir = '/etc/netctl'
min_ratio = 0.90 # 90%

profiles = dict((i, {'full_path': v, 'matches': [], 'file_name': path.splitext(path.split(v)[-1])[0]}) for (i, v) in enumerate(glob(config_dir + '/*.*')))

for K, V in profiles.items():
    sm = SequenceMatcher(a=V['file_name'], b='')
    for k, v in profiles.items():
        if K == k or k in V['matches']:
            continue
        sm.set_seq2(v['file_name'])
        if sm.ratio() > min_ratio:
            V['matches'].append(k)
            v['matches'].append(K)

# display the output
for k, v in profiles.items():
    print k, v