0

忽略这个问题。这与我需要问的实际问题完全不同。对于已经回答问题的人,我很抱歉。不过,希望这对将来的某人有所帮助。

在此处阅读新线程:打开从 os.listdir() 找到的文件并比较里面的行?

基本上,我正在运行 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

不过,我不确定我会用什么来检查名称的相似之处。但是,我知道“if i in i”只是检查同一个单词……但我不知道如何保存最后一个单词……

我也试过:

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。

4

1 回答 1

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
于 2013-05-21T08:39:21.030 回答