Python程序在哈希值中搜索特定字符串(编码帮助)

1 投票
3 回答
1344 浏览
提问于 2025-04-15 22:39

我正在尝试写一段代码,目的是搜索用户输入的特定字符串的哈希值,并在该行中找到搜索的内容时返回哈希值。

这样做主要是为了更好地学习Python,但这也可以是一个实际应用,比如人力资源部门用来在一个.csv格式的简历数据库中搜索每份简历中的特定词汇。

我希望这个程序能够查看一个.csv文件,每行有三个条目(编号;申请者姓名;简历文本)。

我设置了一个哈希值的生成,然后为简历文本的哈希条目创建了一个字符串,并尝试使用.find()函数来返回每个实例的整个哈希值。

我希望的是,如果使用“gpa”作为搜索词,并且在三个申请者(.csv文件中的行)的s['resumetext']中找到了这个词,它就会打印出每一行的编号、姓名和简历。(所有三个申请者的信息)

目前我的程序无论搜索词是什么,都会打印出.csv文件中的第一行(打印resume['id'], resume['name'], resume['resumetext']),不管搜索词是否在简历文本中。

最后,我想知道有没有更好的方法来实现这个功能,比如用Python在一个文件夹中搜索Word文档、PDF和.txt文件中的特定词汇(我刚开始了解re模块,想知道这是否是个好办法,而不是把所有内容都放在一个.csv文件中)。

def find_details(id2find):
    resumes_f=open("resume_data.csv")
    for each_line in resumes_f:
        s={}
        (s['id'], s['name'], s['resumetext']) = each_line.split(";")
        resumetext = str(s['resumetext'])
        if resumetext.find(id2find):
            return(s)
        else:
            print "No data matches your search query. Please try again"

searchquery = raw_input("please enter your search term")
resume = find_details(searchquery)
if resume:
    print resume['id'], resume['name'], resume['resumetext']

3 个回答

0

我建议你对代码做一个修改,把

if resumetext.find(id2find):

改成

if resumetext.find(id2find) != -1:

这是因为,find() 函数如果找不到 id2find,它会返回 -1。否则,它会返回 id2find 在 resumetext 中第一次出现的位置,这个位置可能是 0。正如 @Personman 提到的,这样会导致误判,因为在 Python 中,-1 被当作 True 来处理。

我觉得这个问题跟 find_details() 函数有关,因为它只返回在 resumetext 中找到的第一个匹配项。把 find_details() 改成一个生成器可能会更好,这样你就可以逐个遍历并打印出找到的记录。

1

正如@Justin Peel所说的。为了让代码更符合Python的风格,我建议把

if resumetext.find(id2find) != -1: 改成 if id2find in resumetext:

还有一些其他的改动:你可能想把比较和用户输入都转换成小写,这样就能匹配到GPA、gpa、Gpa等不同的写法。你可以通过这样做:searchquery = raw_input("请输入你的搜索词").lower()resumetext = s['resumetext'].lower()。你会注意到我去掉了s['resumetext']周围的强制转换,因为那并不需要。

1

这一行

resumetext = str(s['resumetext'])

是多余的,因为 s['resumetext'] 本身已经是一个字符串(因为它是通过 .split 方法得到的结果之一)。所以,你可以把这一行和下一行合并成

if id2find in s['resumetext']: ...

你接下来的 else 对齐有问题——这样放的话,你会一直重复打印这个消息。你应该把它放在 for 循环之后(虽然 else 不是必须的,但放在那里也可以),所以我建议:

for each_line in resumes_f:
    s = dict(zip('id name resumetext'.split(), each_line.split(";"))
    if id2find in s['resumetext']:
        return(s)
print "No data matches your search query. Please try again"

我还展示了一种构建字典 s 的替代方法,虽然你原来的方法也没问题。

撰写回答