2016-09-25 7 views
1

파일에서 단어를 검색하려고합니다. 그 단어들은 별도의 목록에 저장됩니다. 발견 된 단어는 다른 목록에 저장되고 그 목록은 끝에 반환됩니다. 그것은 나에게 내 비교가 작동하지 않는 것을 의미 빈 "좌석"의 무리와 함께 목록을 반환파일에서 단어 목록 검색

def scanEducation(file): 
    education = [] 
    qualities = ["python", "java", "sql", "mysql", "sqlite", "c#", "c++", "c", "javascript", "pascal", 
      "html", "css", "jquery", "linux", "windows"] 
    with open("C:\Users\Vadim\Desktop\Python\New_cvs\\" + file, 'r') as file1: 
    for line in file1: 
     for word in line.split(): 
      matching = [s for s in qualities if word.lower() in s] 
      if matching is not None: 
       education.append(matching) 
return education 

첫째, 같은

코드가 보인다?

결과

(스캔 4 파일) :

Name: Some Name 
Phone: 1234567890 
email: [email protected] 
python,excel,linux 

두 번째 문제 각 파일는 containes 3 개 가지 기술을하지만, 기능은 1 또는 2인가 찾습니다

"C:\Program Files (x86)\Python2\python.exe" C:/Users/Vadim/PycharmProjects/TestFiles/ReadTXT.py 
[[], [], [], [], [], [], [], [], [], ['java', 'javascript']] 
[[], [], [], [], [], [], [], [], [], ['pascal']] 
[[], [], [], [], [], [], [], [], [], ['linux']] 
[[], [], [], [], [], [], [], [], [], [], ['c#']] 

Process finished with exit code 0 

입력 파일에 포함 된 그것도 나쁜 비교 또는 여기에 다른 오류가 있습니까?

나는 빈 자리가없는 단지 발견 된 기술의 목록이고 파일의 모든 기술을 찾을 수있을 것이라고 기대한다.

편집 :이 기능은 내가 word.split(', ') 을 수행 할 때 모든 기술을 찾을 않지만 내가 좋아하면 그것이 내가 모르는 경우에 그 기술을 찾을 수있는 좋은 방법이 될 수 있는지, 더 보편적으로 정확히 것입니다 그들을 분리합니까?

+0

입력 파일과 예상 출력을 제공 할 수 있다면 도움이 될 수 있습니다. – SilentMonk

+0

이 수정되었습니다. 감사! – Kiper

+0

공백 대신 쉼표로 분리하여보십시오. line.split() -> line.split (",") – Checkmate

답변

1

None이 빈 목록과 같지 않으므로 빈 목록이 표시됩니다. 당신이 할 수 있습니다하면 다음에 조건을 변경하는 것입니다 :

if matching: 
    # do your stuff 

문자열이 특성 목록에서 문자열의 존재 여부를 확인하는 것으로 보인다. 네가 원하는대로되지 않을 수도있어. 둘 다 ,과 공간을 일치로 찾는 경우

words = line.split() 
match = [word for word in words if word.lower() in qualities] 

, 당신이 할 수 있습니다 : 당신은 자질 목록에 표시 줄에 단어를 확인하고 싶은 경우에, 당신은 당신의 지능형리스트를 변경할 수 있습니다 정규식을 조사하십시오. Split Strings with Multiple Delimiters?을 참조하십시오.

+0

고마워요! 코드에서 파일의 첫 번째 기술을 반환했지만 나머지는 반환하지 않았습니다. – Kiper

+0

@Kiper 필자는 기본적으로 공백을 사용하여 줄을 분할하는'line.split()'을 사용했습니다. 입력 파일이 쉼표를 사용한다면'split (',')'를 사용하십시오. 어쩌면 당신은 다양한 구분 기호를 가지고 있다면 정규식을 봐야 할 것입니다. – krato

+0

고마워, 만약 내가 거기에 정규식을 결합하고 싶습니다. 그것은 line.split (여기?) 안쪽으로 가야하거나 분리되어야합니까? – Kiper

1
코드는 (내가 제대로 원하는 출력 형식을 이해하는 경우)은 다음과 같이 작성해야

: 모든

def scanEducation(file): 
    education = [] 
    qualities = ["python", "java", "sql", "mysql", "sqlite", "c#", "c++", "c", "javascript", "pascal", 
      "html", "css", "jquery", "linux", "windows"] 
    with open("C:\Users\Vadim\Desktop\Python\New_cvs\\" + file, 'r') as file1: 
    for line in file1: 
     matching = [] 
     for word.lower() in line.strip().split(","): 
      if word in qualities: 
       matching.append(word) 
     if len(matching) != 0: 
      education.append(matching) 
return education 
+0

은 "일치 = .."행이 맞습니까? 나는 그것을 사용하여 오류가 발생했습니다 – Kiper

+0

이것은 내 코드 XD를 테스트하지 않은 것입니다. 이건 일해야 돼, 미안해! – Checkmate

+0

고마워, 여기에있는 모든 대답은 파일의 첫 번째 기술 만 반환하지만 다른 하나는 반환하지 않습니다. 2. 나는 잘못된 것을하고 있습니까? – Kiper

1

먼저 당신의 상태가 올바르게 정의되지 않기 때문에, 당신은 "빈 좌석"의 무리를 얻고있다 . 일치하는 항목이 빈 목록이면 None이 아닙니다. 즉 : [] is not NoneTrue으로 평가됩니다. 이것이이 "빈 자리"를 모두 얻는 이유입니다.

초 모두 목록 작성의 조건은 원하는 것이 아닙니다.

[s for s in qualities if word.lower() == s]

이것은 품질의 목록을 확인하고 단어가 하나 인 경우에만 비어 있지 않은 목록을 반환합니다 : 여기 당신의 목표를 오해했습니다 않는 한, 당신이 찾고있는 조건이있다 자질.그러나이 목록의 길이가 항상 1 (일치하는 경우) 또는 0 (존재하지 않는 경우)은 파이썬의 내장 된 함수를 사용하여 부울로 바꿀 수 있습니다.

도움이되기를 바랍니다. 귀하의 목표를 오해 한 적이 있다면 알려 주시거나 알려 주시면 언제든지 후속 질문을하시기 바랍니다. 여기에 사용하는 간단한 예제입니다

def scan_education(file_name): 
    education = [] 
    qualities_list = ["python", "java", "sql", "mysql", "sqlite", "c\#", "c\+\+", "c", "javascript", "pascal", 
         "html", "css", "jquery", "linux", "windows"] 
    qualities = re.compile(r'\b(?:%s)\b' % '|'.join(qualities_list)) 
    for line in open(file_name, 'r'): 
     education += re.findall(qualities, line.lower()) 
    return list(set(education)) 
+0

감사합니다. 코드를 사용하여 모든 파일에서 첫 번째 기술을 제공했지만 두 번째 기술은 제공하지 않았습니다. – Kiper

1

당신은이 같은 정규 표현식을 사용할 수 있습니다

당신의 convinevce를 들어

, 여기에 내가 나 자신을 확인하기 위해 사용했던 변형 한 소스입니다 텍스트 파일 (또는 텍스트 문자열 만 사용함)과 사용자가 제공하는 목록 사이의 공통 단어를 찾기위한 목록 이해력 설정과 약간의 설정이 포함되어 있습니다. 루프를 사용하는 것보다 빠르고 명확합니다.

import string 

try: 
    with open('myfile.txt') as f: 
     text = f.read() 
except: 
    text = "harry met sally; the boys went to the park. my friend is purple?" 

my_words = set(("harry", "george", "phil", "green", "purple", "blue")) 

text = ''.join(x for x in text if x in string.ascii_letters or x in string.whitespace) 

text = set(text.split()) # split on any whitespace 

common_words = my_words & text # my_words.intersection(text) also does the same 

print common_words 
1

을 :

def scanEducation(file): 
    education = [] 
    qualities = ["python", "java", "sql", "mysql", "sqlite", "c#", "c++", "c", "javascript", "pascal", 
      "html", "css", "jquery", "linux", "windows"] 
    with open(file, 'r') as file1: 
     for line in file1: 
      for word in line.split(): 
       if any(s == word.lower() for s in qualities): 
        education.append(word) 
    return education