파이썬 관련입니다. 혹시 아시는 분은 팁이라도 주시면 감사히 받겠습니다. ㅠ.ㅠ

알림
|
X

페이지 정보

작성자 EthanHunt 211.♡.60.82
작성일 2024.09.05 16:07
315 조회
0 추천
글쓰기

본문

목적 -

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()


댓글 4 / 1 페이지

EthanHunt님의 댓글

작성자 EthanHunt (211.♡.60.82)
작성일 09.05 16:08
흑~ 도움받을 놈이 Ai였는데... 이젠 chatGPT로도 안되네요. ㅠ.ㅠ

LiNE님의 댓글

작성자 LiNE (210.♡.102.188)
작성일 09.05 16:40
한글 인코딩 문제 아닌가요?
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님의 댓글의 댓글

대댓글 작성자 EthanHunt (211.♡.60.82)
작성일 09.05 16:51
@LiNE님에게 답글 대박 해결했습니다. 감사합니다.!!!!

LiNE님의 댓글의 댓글

대댓글 작성자 LiNE (210.♡.102.188)
작성일 09.05 17:10
@EthanHunt님에게 답글
글쓰기
전체 검색