파이썬 관련입니다. 혹시 아시는 분은 팁이라도 주시면 감사히 받겠습니다. ㅠ.ㅠ
페이지 정보
본문
목적 -
1. 바탕화면의 TEST 폴더에 들어있는 엑셀 파일을 찾아 특정 위치의 TEXT를 뽑는다. 특정한 정리에 의하여 앞부분과 뒷부분으로 나열시킨다.
2. 해당 폴더에 PDF 파일을 찾는다.
3. {b_value}_표지 , {b_value)_내지 를 붙여서 pdf 파일명과 비교시킨다.
4. 같은 이름이 나오면... PDF의 파일명을 다음과 같이 변경시킨다.
_표지 가 붙는 애들은 - 표지줄의 앞부분+뒷부분.pdf 로 파일명을 변경시킨다.
_내지 가 붙는 애들은 - 내지줄의 앞부둔+뒷부분.pdf 로 파일명을 변경시킨다.
5. 변경이 되는지 확인이 되면 이놈을 exe실행파일로 만든다.
지금 이 과정 중에 3번까지 갔는데... 3번에서 파일이 동일한게 있는데도 못찾고 있네요. 예를 들면)
결과값
- PDF 파일명 목록:
가나다_5555.pdf
가나다_6666.pdf
01-표지.pdf
가나다_7777.pdf
01-내지.pdf
- 추출된 b_value 목록:
01.가나다_1111-표지.pdf
09.가나다_9999-내지.pdf
01-표지.pdf
01-내지.pdf
02-표지.pdf
02-내지.pdf
이렇게 출력이 되면 "01-표지.pdf" 과 "01-내지.pdf" 두개를 찾아야 하는데....
일치하는 PDF 파일명 목록:
일치하는 PDF 파일명이 없습니다.
라고 나옵니다. ㅠ.ㅠ 어떻게 해야할지 감도 안옵니다. 혹시 아시는 분 있으시면 좀 도와주시면 감사드리겠습니다.
아래는 소스입니다.
-------------------------------------------------------------------------------------------------
import pandas as pd
import os
import numpy as np # numpy를 import 해야 합니다.
def extract_and_format_text(excel_path):
# 엑셀 파일을 읽어옵니다.
df = pd.read_excel(excel_path, sheet_name=0, header=None)
# 빈 셀을 NaN으로 변환
df = df.replace(r'^\s*$', np.nan, regex=True)
# 각 셀의 값을 가져옵니다.
def get_cell_value(df, row, col, default=''):
return str(df.iat[row, col]) if pd.notna(df.iat[row, col]) else default
try:
b4 = pd.to_datetime(get_cell_value(df, 3, 1)).strftime('%m%d').strip() # B4 셀 값 (날짜를 mmdd로 변환 후 공백 제거)
except (ValueError, TypeError):
b4 = '' # 날짜 변환 실패 시 기본값 설정
d5 = get_cell_value(df, 4, 3) # D5 셀 값
d4 = get_cell_value(df, 3, 3) # D4 셀 값 (D4 셀 값이 없을 경우 생략할 예정)
a7 = get_cell_value(df, 6, 0) # A7 셀 값
b14 = get_cell_value(df, 13, 1).replace('+', '플러스') # B14 셀 값 ('+'를 '플러스'로 변경)
b15 = get_cell_value(df, 14, 1).replace('+', '플러스') # B15 셀 값 ('+'를 '플러스'로 변경)
e14 = get_cell_value(df, 13, 4) # E14 셀 값
e15 = get_cell_value(df, 14, 4) # E15 셀 값
f15 = get_cell_value(df, 14, 5) # F15 셀 값
g14 = get_cell_value(df, 13, 6) # G14 셀 값 추가
# H14, H15, I14, J14 셀 값 가져오기 (텍스트가 있는 경우만 출력)
h14 = get_cell_value(df, 13, 7)
h15 = get_cell_value(df, 14, 7)
i14 = get_cell_value(df, 13, 8)
j14 = get_cell_value(df, 13, 9)
# H14, H15, I14, J14 중 값이 있는 셀만 괄호로 구분하여 결합
additional_values = ''.join([f"({val})" for val in [j14, h15, h14, i14] if val])
results = []
start_row = 19 # 시작 행 (B20이 있는 행)
last_row = df.index[-1] # 마지막 유효 행 인덱스
b_values = [] # b_value를 저장할 리스트 추가
for row in range(start_row, last_row + 1):
if row >= len(df): # 데이터프레임의 범위를 초과한 경우
break
# B셀 값을 가져옵니다.
b_value = get_cell_value(df, row, 1)
if pd.isna(b_value) or b_value.strip() == '': # B셀에 값이 없으면 반복 종료
break
b_values.append(b_value) # b_value를 리스트에 추가
# A셀 값을 가져옵니다.
a_value = get_cell_value(df, row, 0)
if pd.isna(a_value): # A셀에 값이 없는 경우
continue
i_value = get_cell_value(df, row, 8) # I셀 값
h_value = get_cell_value(df, row, 7).replace('*', 'x') # H 열 값 ('*'를 'x'로 변경)
# D4 셀 값이 없으면 D4 관련 출력 생략
d4_text = f"({d4})" if d4 else ""
# 내지줄
front_text1 = f"{b4} {d5}{d4_text} {a7}( ) -- {b_value}-내지 -"
back_text1 = f"{b15}( ) - {e15} - {h_value} - {i_value if i_value else 'non'}부"
# 표지줄
front_text2 = f"{b4} {d5}{d4_text} {a7}( ) -- {b_value}-표지 -"
back_text2 = f"{b14}( ) - {e14} - 내지{f15} - {g14} - {i_value if i_value else 'non'}장"
if additional_values:
back_text2 += f" {additional_values}"
results.append((front_text1, back_text1, front_text2, back_text2))
return results, b_values
def main():
# 경로 확장
folder_path = os.path.expanduser("~/Desktop/test") # test 폴더 경로
# 폴더 안의 모든 파일 중에서 첫 번째 엑셀 파일을 찾습니다.
excel_files = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')]
if not excel_files:
print("엑셀 파일을 찾을 수 없습니다.")
return
# 첫 번째 엑셀 파일을 선택
excel_path = os.path.join(folder_path, excel_files[0])
# 텍스트를 추출하고 형식에 맞게 결합합니다.
results, b_values = extract_and_format_text(excel_path)
# 결과 출력
file_name = os.path.basename(excel_path) # 엑셀 파일명 추출
print(f"엑셀 파일명: {file_name}\n")
for i, (front_text1, back_text1, front_text2, back_text2) in enumerate(results, start=1):
print(f"내지줄 {i} - 앞부분: {front_text1}")
print(f"내지줄 {i} - 뒷부분: {back_text1}")
print(f"표지줄 {i} - 앞부분: {front_text2}")
print(f"표지줄 {i} - 뒷부분: {back_text2}")
print()
# PDF 파일명 출력
pdf_files = [f for f in os.listdir(folder_path) if f.endswith('.pdf')]
print("PDF 파일명 목록:")
for pdf_file in pdf_files:
print(pdf_file)
# b_value 출력
print("\n추출된 b_value 목록:")
for b_value in b_values:
print(f"{b_value}-표지.pdf")
print(f"{b_value}-내지.pdf")
# 일치하는 PDF 파일명 목록
print("\n일치하는 PDF 파일명 목록:")
matching_pdf_files = []
for b_value in b_values:
# 접미사와 확장자 처리
b_value_with_suffixes = [
f"{b_value}.pdf", # 기본 형태
f"{b_value}-표지.pdf", # 표지 접미사
f"{b_value}-내지.pdf" # 내지 접미사
]
for suffix in b_value_with_suffixes:
if suffix in pdf_files:
matching_pdf_files.append(suffix)
matching_pdf_files = list(set(matching_pdf_files)) # 중복 제거
matching_pdf_files.sort() # 정렬
if matching_pdf_files:
for pdf_file in matching_pdf_files:
print(pdf_file)
print(f"총 {len(matching_pdf_files)}개의 PDF 파일명이 일치합니다.")
else:
print("일치하는 PDF 파일명이 없습니다.")
if __name__ == "__main__":
main()
LiNE님의 댓글
def normalize_string(s):
# 유니코드 NFC 형식으로 정규화
if s:
normalized = unicodedata.normalize('NFC', s)
# 공백 제거 및 소문자로 변환
cleaned = normalized.strip().replace(" ", "").lower()
return cleaned
return ""
pdf_files = [
normalize_string(f) for f in os.listdir(folder_path) if f.endswith('.pdf')
]
...
# 정규화된 PDF 파일명 비교
for pdf_file in pdf_files:
if any(suffix == pdf_file for suffix in b_value_with_suffixes):
matching_pdf_files.append(pdf_file)
요케 해보시면..?
EthanHunt님의 댓글