파이썬 코드 질문드립니다

파이썬 코드 질문드립니다

QA

파이썬 코드 질문드립니다

답변 1

본문

안녕하세요.

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

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

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

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 122
© SIRSOFT
현재 페이지 제일 처음으로