파이썬 코드 질문드립니다
본문
안녕하세요.
제가 아래 코드를 사용해 기업의 사업보고서 내용을 읽어 가독성 지수라는 것을 만들어야 하는데요.
코드는 작동되고 수치도 뽑아지는데,
예를 들어 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() # 엑셀파일 워크시트 닫고 저장
close() 메써드를 for문 안에 넣었을 때에는 말씀하신대로 1행만 작성되었는데요.
이를 밖으로 빼주니 캡쳐한 화면처럼 정상적으로 2행까지 작성되네요 ^^
상대경로와 절대경로 모두 테스트해봤어요.
그럼 작업에 도움이 되셨으면 좋겠습니다.
즐거운 연말 되세요 :)
+)
PDF 파일과 관련해서는 pdf to docx 툴을 사용하셔서 변환을 하시거나
Document 라이브러리 대신에 PyPDF2 라이브러리를 사용하시면 될 것 같네요 ^^
!-->