파이썬 코드 질문드립니다

파이썬 코드 질문드립니다

QA

파이썬 코드 질문드립니다

본문

안녕하세요.

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

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

예를 들어 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

안녕하세요?

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

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

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

 


        row_w = row_w + 1 # 다음 행으로 넘어가기
        print("end") # 해당 회계연도 전부 수행시 “end” 출력
workbook.close() # 엑셀파일 워크시트 닫고 저장

 

1890256330_1544946119.8274.png

 

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

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

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

 

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

즐거운 연말 되세요 :)

 

+)

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

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

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

답변을 작성하시기 전에 로그인 해주세요.
전체 123,534 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT