2016-10-10 10 views
0

xlrd를 사용하여 엑셀 시트에서 열을 추출하여 목록으로 만드십시오.Python : 문자열 목록에서 문자열 부분을 제거하십시오.

from xlrd import open_workbook 
book = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0) 
med_name = [] 
for row in sheet.col(2): 
    med_name.append(row) 
med_school = [] 
for row in sheet.col(3): 
    med_school.append(row) 
print(med_school) 

다음은 목록의 스 니펫입니다. med_school.

[text:'University of San Francisco', 
text: 'Harvard University', 
text:'Class of 2016, University of Maryland School of Medicine', 
text:'Class of 2015, Johns Hopkins University School of Medicine', 
text:'Class of 2014, Raymond and Ruth Perelman School of Medicine at the 
University of Pennsylvania'] 

목록의 각 문자열에서 'text :'Class of 2014 '를 제거하고 싶습니다. 목록 이해력을 시도했지만 속성 오류가 있습니다. '셀'객체에는 '스트립'속성이 없습니다. 누구든지 학년도와 단어 "텍스트"가없는 의과 대학 이름을 가진 의과 대학 이름 목록을 만드는 방법을 알고 있습니까?

+4

예제 목록 출력에 문제가 있습니다. 아마도''텍스트와 같은 추가 따옴표가있을 것입니다. ''of Class ... ' "'? 아마도 출력물을 여기에서 바로 복사하거나 붙여 넣기 * 할 수 있습니다. – jwd

+0

** text 앞에 ** 큰 따옴표가없고 ** 각 행의 끝에 있습니까? – Prune

+0

리스트 출력에 아무런 문제가 없습니다. 이것은 단순히'xlrd.Cell' 인스턴스가'__repr__'을 구현하는 방식입니다. – donkopotamus

답변

1

각 문자열의 머리를 잘라내려면 주어진 구분 기호를 사용하십시오. 먼저 "클래스"가 있는지 확인하십시오. 따라서 쉼표가 있음을 알 수 있습니다.

med_school = ["text:'Class of 2016, University of Maryland School of Medicine'", 
       "text:'Class of 2015, Johns Hopkins University School of Medicine'", 
       "text:'Class of 2014, Raymond and Ruth Perelman School of Medicine at the University of Pennsylvania'", 
       "text:'Class of 1989, Rush Medical School/Knox College'", 
       "text:'Bernie\'s Back-Alley School of Black-Market Techniques'" 
      ] 

school_name = [] 
for first in med_school: 
    name = first.value 
    if ", " in name: 
     cut = name.index(", ") 
     name = name[cut+2:] 
    else: 
     name = name[6:-1] 
    school_name.append(name) 

print school_name 

출력 (추가 라인은 가독성을 향상시키기 위해 피드) :

school_name = [name.value[name.value.index(", ")+2:] \ 
         if ", " in name \ 
         else name[6:-1] \ 
        for name in med_school] 
+0

또한이 솔루션을 시도하고 특성 오류가 있습니다. '셀'개체에 'index'특성이 없습니다 –

+0

맞음; 이 cell.value ... 편집 작업해야합니다 ... – Prune

+0

두 솔루션을 시도하고 "하위 문자열을 찾을 수 없습니다"라는 값 오류가 발생했습니다. "name.value.index (", "))가 포함 된 줄에 오류가 발생합니다. –

4

xlrd는 문자열을 반환하지 않습니다

["University of Maryland School of Medicine'", 
"Johns Hopkins University School of Medicine'", 
"Raymond and Ruth Perelman School of Medicine at the University of Pennsylvania'" 
"Rush Medical School/Knox College'", 
"Bernie's Back-Alley School of Black-Market Techniques"] 

또한 지능형리스트로 루프를 포장 할 수 , Cell 클래스의 인스턴스를 반환합니다. 이 문자열에는보고있는 문자열이 포함 된 value 속성이 있습니다.

다음 단순히 수정하려면 :

for cell in med_school: 
    cell.value = cell.value[:15] 

이는 처음 15 개 문자를 제거 ("2014 클래스")합니다. 또는 문자열 분할 (",") 또는 정규식과 같은 다른 접근법을 사용할 수도 있습니다.

여기에서 요점은 med_schools 목록의 값이 아니라 .value 속성의 값에서 직접 작업하지 않아야한다는 것입니다. 또는 다른 곳으로 추출하여 작업 할 수 있습니다.

예를 들어, 접두사 떨어지고, 텍스트의 모든 속성을 얻을 수 있습니다 : 그 잘못된 데이터를 포함 actualling 만 교체

values = [cell.value[15:] for cell in med_schools] 

또는 대체 정규식을 사용하여

values = [re.sub(r"^Class of \d{4}, ", "", cell.value) for cell in med_schools] 
+0

처음 두 가지 해결책을 시도했지만 속성 오류가 발생했습니다 : '셀'객체의 'text'속성이 없습니다 –

+0

'.text'를'.value'로 변경하십시오 – donkopotamus

+0

정말 고마워요! 내 코드가 작동했습니다. 이 문서에 대한 링크가 있습니까? 일부 값은 "Class of 201"을 가지지 않으므로 값이 "Class of Class"일 때 처음 15 자만 제거하는 if 문을 수행하는 방법에 대한 구문을 찾고 있습니다. –

1

변경 for row in sheet.col(2)for row in sheet.col(2).value.
U는 파일 형식을 제거하고 실제 값을 얻습니다.