테스트 사이트 - 개발 중인 베타 버전입니다

파이썬 코드 질문드립니다 채택완료

ahnu 6년 전 조회 2,803

안녕하세요.

제가 아래 코드를 사용해 기업의 사업보고서 내용을 읽어 가독성 지수라는 것을 만들어야 하는데요.

코드는 작동되고 수치도 뽑아지는데, 

예를 들어 a, b, c, d, e 5개 기업의 2015년도 사업보고서를 경로 폴더에 넣고 아래 코드를 돌렸을 때 결과로 저장된 엑셀 파일을 열어보면,  5개 중 1개 기업의 수치만이 저장되어 있고 4개 기업은 저장이 되지 않습니다... ㅠㅠ 무엇이 잘못된 건가요??

 

또한 아래 코드는 docx 파일일 때 작동이 되는 코드인데, 사실 제가 가질 수 있는 원본파일은 pdf라 pdf를 읽어낼 수 있는 코드가 된다면 어떻게 수정이 되야하나요?

 

부탁드립니다. 감사합니다.

 

------------------------------------------------------------------------------------------------------- 

 

from docx import Document import xlsxwriter import os savename = "/Users/seahn/Downloads/fiscal_year.xlsx" # 연도별 가독성 측정 결과 저장경로) workbook = xlsxwriter.Workbook(savename) worksheet = workbook.add_worksheet() row_w = 0 for root, directories, files in os.walk("/Users/seahn/Downloads/reports"):# 사업보고서 저장경로     # 가독성지수의 구성요소별 집계 시작점을 “0”으로 지정     for filename in files:         file_len = len(os.path.splitext(filename)[0]) # 파일명의 글자수 세기         if os.path.splitext(filename)[0][file_len-4:file_len] == "2015": # 회계연도(예시)             letter_num = 0 # 글자수             word3_num = 0 # 3음절이상 단어수             word5_num = 0 # 5음절이상 단어수             word7_num = 0 # 7음절이상 단어수             word10_num = 0 # 10음절이상 단어수             word_num = 0 # 단어수             sentence_num = 0 # 문장수             document = Document(root + "/" + filename)

            # 단락 내 각 구성요소 집계과정             for para in document.paragraphs:                 for i in range(0, len(para.text.split())):                     # 단어수는 빈칸(“ ”)으로 구분                     # 글자수 또는 음절수는 단어를 구성하는 요소로 판단함.                     letter_num = letter_num + len(para.text.split()[i])                     word_num = word_num + 1                     if len(para.text.split()[i]) > 2:                         word3_num = word3_num + 1                     if len(para.text.split()[i]) > 4:                         word5_num = word5_num + 1                     if len(para.text.split()[i]) > 6:                         word7_num = word7_num + 1                     if len(para.text.split()[i]) > 9:                         word10_num = word10_num + 1                 for i in range(0,len(para.text.split("."))): # 문장수는 마침표로 구분                     split_length = len(para.text.split(".")[i])                     if split_length == 0:                         sentence_num = sentence_num                     elif para.text.split(".")[i][split_length - 1].isdigit():                         sentence_num = sentence_num                     # 마침표 앞에 숫자면 제외, 예 : 10.31%, 17.08.11 등                     else:                         sentence_num = sentence_num + 1             # 위의 경우를 제외하고, 문장수 집계             # 엑셀 시트에 행단위로 출력 (제일 첫 번쨰 열에 회사명으로 시작)             worksheet.write(row_w, 0, os.path.splitext(filename)[0][0:file_len - 4])             worksheet.write(row_w, 1, letter_num) # 글자수             worksheet.write(row_w, 2, word_num) # 단어수             worksheet.write(row_w, 3, word3_num) # 3음절이상 단어수             worksheet.write(row_w, 4, sentence_num) # 문장수             AWL = letter_num/word_num # Flesch 구성요소 : 평균 단어 길이             ASL = word_num/sentence_num # Flesch 구성요소 : 평균 문장 길이             flesch = 206.835 - 84.6 * AWL - 1.015 * ASL # Flesch 측정             worksheet.write(row_w, 5, AWL) # AWL             worksheet.write(row_w, 6, ASL) # ASL             worksheet.write(row_w, 7, flesch) # Flesch Index             worksheet.write(row_w, 8, word5_num) # 5음절이상 단어수             worksheet.write(row_w, 9, word7_num) # 7음절이상 단어수             worksheet.write(row_w, 10, word10_num) # 10음절이상 단어수             print(os.path.splitext(filename)[0] + "is collected:", letter_num, word_num, word3_num, sentence_num, AWL, ASL, flesch, word5_num, word7_num, word10_num)  # 프로그램 화면에 출력하여 결과 진행 확인가능             row_w = row_w + 1  # 다음 행으로 넘어가기             workbook.close()  # 엑셀파일 워크시트 닫고 저장             print("end")  # 해당 회계연도 전부 수행시 “end” 출력

 

 

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

채택된 답변
+20 포인트
I
6년 전

안녕하세요?

우선 구글링해보니 Document 라이브러리와 xlsxwriter 라이브러리는 예민한 편이네요.

제가 DOCX 파일 두 개를 생성해서 테스트해봤는데요.

다음과 같은 방식으로 for문 안에 있는 workbook.close()를 for문 밖으로 빼니 정상적으로 작동합니다.

 

</p>

<p>        row_w = row_w + 1 # 다음 행으로 넘어가기</p>

<p>        print("end") # 해당 회계연도 전부 수행시 “end” 출력</p>

<p>workbook.close() # 엑셀파일 워크시트 닫고 저장</p>

<p>

 

 

close() 메써드를 for문 안에 넣었을 때에는 말씀하신대로 1행만 작성되었는데요.

이를 밖으로 빼주니 캡쳐한 화면처럼 정상적으로 2행까지 작성되네요 ^^

상대경로와 절대경로 모두 테스트해봤어요.

 

그럼 작업에 도움이 되셨으면 좋겠습니다.

즐거운 연말 되세요 :)

 

+)

PDF 파일과 관련해서는 pdf to docx 툴을 사용하셔서 변환을 하시거나

Document 라이브러리 대신에 PyPDF2 라이브러리를 사용하시면 될 것 같네요 ^^

http://mstamy2.github.io/PyPDF2/

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

a
ahnu
6년 전
시도해보겠습니다. 답변 주셔서 정말 감사드립니다!
a
ahnu
6년 전
즐거운 연말연시 되세요!!
E
Evelyn
6년 전
수정된 스크립트가 다행히 잘 작동하시는가보군요~ ^^
저야말로 감사드립니다!
그럼 감기 조심하시고 남은 연말 뜻깊게 보내시길 기원합니다 :)

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인