Попытка написать код, который ищет значения хэш-функции определенную строку (введенный пользователем) и возвращает хеш, если searchquery присутствует в той строке.
Выполнение этого к отчасти просто изучает Python немного больше, но это могло быть приложение реального мира, используемое отделом кадров для поиска базы данных резюме .csv определенные слова в каждом резюме.
Я хотел бы, чтобы эта программа просмотрела .csv файл, который имеет три записи на строку (id#; имя претендента; текст резюме)
Я настроил его так, чтобы это создало хеш, затем создал строку для текстовой записи хеша резюме и пытаюсь использовать .find () функция для возврата всего хеша для каждого экземпляра.
То, что я хотел бы, - то, если слово "с.б.б." используется в качестве поискового запроса, и это найдено в s ['resumetext'] для трех заявителей (строки в .csv файле), это печатает идентификатор, имя и резюме для каждой строки, которая имеет его. (Все три заявителя)
Поскольку это прямо сейчас, моя программа печатает первую строку в .csv файле (резюме печати ['идентификатор'], резюме ['имя'], резюме ['resumetext']), каков searchquery, является ли это в resumetext или нет.
наконец, есть ли лучшие пути к выполнению этого, путем поиска документов слова, и .txt файлов PDF в папке для определенных слов с помощью Python (я только что начал читать о модуле ре, и задаюсь вопросом, может ли это быть маршрутом, вместо того, чтобы поместить все в .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']
Строка
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"
Я также показал альтернативный способ построения dict s
, хотя ваш тоже подходит.
Одно изменение, которое я рекомендую для вашего кода, - это изменение
if resumetext.find(id2find):
на
if resumetext.find(id2find) != -1:
, потому что find () возвращает -1, если id2find не было в тексте резюме. В противном случае он возвращает индекс, в котором id2find впервые встречается в тексте резюме, который может быть 0. Как прокомментировал @Personman, это даст вам ложное срабатывание, потому что -1 интерпретируется как True в Python.
Я думаю, что эта проблема связана с тем фактом, что find_details () возвращает только первую запись, для которой строка поиска найдена в тексте резюме. Было бы неплохо превратить find_details () в генератор, а затем вы могли бы перебирать его и распечатывать найденные записи одну за другой.
Что сказал @Justin Peel. Также, чтобы быть более питоническим, я бы сказал, измените
if resumetext.find (id2find)! = -1:
на , если id2find в resumetext:
Еще несколько изменений: вы можете захотеть использовать нижний регистр сравнение и ввод данных пользователем, чтобы он соответствовал GPA, GPA, Gpa и т. д. Вы можете сделать это, выполнив searchquery = raw_input ("введите свой поисковый запрос"). lower ()
and resumetext = s ['resumetext']. lower ()
. Вы заметите, что я удалил явное приведение к s ['resumetext'], поскольку оно не нужно.