Python程序在哈希值中搜索特定字符串(编码帮助)
我正在尝试写一段代码,目的是搜索用户输入的特定字符串的哈希值,并在该行中找到搜索的内容时返回哈希值。
这样做主要是为了更好地学习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 个回答
我建议你对代码做一个修改,把
if resumetext.find(id2find):
改成
if resumetext.find(id2find) != -1:
这是因为,find() 函数如果找不到 id2find,它会返回 -1。否则,它会返回 id2find 在 resumetext 中第一次出现的位置,这个位置可能是 0。正如 @Personman 提到的,这样会导致误判,因为在 Python 中,-1 被当作 True 来处理。
我觉得这个问题跟 find_details() 函数有关,因为它只返回在 resumetext 中找到的第一个匹配项。把 find_details() 改成一个生成器可能会更好,这样你就可以逐个遍历并打印出找到的记录。
正如@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']周围的强制转换,因为那并不需要。
这一行
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
的替代方法,虽然你原来的方法也没问题。