【问题标题】:Try, Except / If Statement Combination - Missing resultsTry,Except / If 语句组合 - 缺少结果
【发布时间】:2019-01-31 15:17:36
【问题描述】:

我将一个大学列表与其他 12 个列表进行比较,找到模糊字符串匹配并将 all 结果写入 csv。我没有对一个大列表进行模糊字符串匹配,因为我需要知道匹配来自哪个列表。 列表示例:

data = [[1-00000, "MIT"], [1-00001, "Stanford"] ,...]

Data1 = ['MASSACHUSETTS INSTITUTE OF TECHNOLOGY (MIT)'], ['STANFORD UNIVERSITY'],...

在 StackOverflow 的帮助下,我做到了:

for uni in data:
    hit = process.extractOne(str(uni[1]), data10, scorer = fuzz.token_set_ratio, score_cutoff = 90)
    try:
        if float(hit[1]) >= 94:
            with open(filename, mode='a', newline="") as csv_file:
                fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
                writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
                writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[1]), 'match': str(hit), 'points': 10})

    except:
        hit1 = process.extractOne(str(uni[1]), data11, scorer = fuzz.token_set_ratio, score_cutoff = 90)
        try:
            if float(hit1[1]) >= 94:
                with open(filename, mode='a', newline="") as csv_file:
                      fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
                      writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
                      writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[1]), 'match': str(hit), 'points': 5})

向下查看 12 个列表,直到最后一个例外,其中我包括那些得分低于 94 并以“未找到”结尾的列表:

    except:
        hit12 = process.extractOne(str(uni[1]), data9, scorer = fuzz.token_set_ratio)
        try:
            if float(hit12[1]) < 94:
                with open(filename, mode='a', newline="") as csv_file:
                       fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
                       writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
                       writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[1]), 'match': str(hit), 'points': 3})
        except:
            with open(filename, mode='a', newline="") as csv_file:
                  fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
                  writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
                  writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[1]), 'match': str(hit), 'points': 3})

但是,我只返回了 2854 个结果,而不是原始列表中的 3175 个(所有这些都需要检查并写入新的 csv)。

当我将所有列表放在一起并执行 extractOne 时,我确实得到了 3175 个结果:

scored_testdata = []
for uni in data:
     hit = process.extractOne(str(uni[1]), big_list, scorer = fuzzy.token_set_ratio, score_cutoff = 90)
     scored_testdata.append(hit)
print(len(scored_testdata))

我在这里缺少什么?我感觉process.extractOne 中返回“无”的结果由于某种原因被丢弃了。 任何帮助将不胜感激。

完整代码可以在here找到。

【问题讨论】:

  • 请修正你的缩进 - 你的代码不是 minimal reproducible example - 很难看出你在做什么......
  • 为什么要在 if float(hit[1]) &gt;= 94: ... 的文件中写入 nothing ?你只在里面写空字符串...... - 为什么 try: except: 呢? ...代码对我来说没有多大意义 - 抱歉
  • 请将您的代码缩减为有意义的minimal reproducible example,其中包含演示数据并复制您的问题。
  • 抱歉,我放弃了写入 csv 的内容,因为它使代码变得凌乱而冗长,过于关注“最小”要求。添加了完整代码的链接。现在编辑问题。谢谢!

标签: python python-3.x csv exception-handling fuzzywuzzy


【解决方案1】:

最后的 try-except 应该是检查所有列表并在没有 score_cutoff 的情况下执行 extractBest:

except:
    hit12 = process.extractOne(str(uni[1]), big_list, scorer = fuzz.token_set_ratio)
    with open(filename, mode='a', newline="") as csv_file:
           fieldnames = ['bwbnr', 'uni_name', 'match', 'confidence', 'points']
           writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
           writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[1]), 'match': "CHECK AGAIN " + str(hit12[0]), 'confidence': str(hit12[1]), 'points': 3})

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多