작성
·
125
·
수정됨
1
안녕하세요. 선생님
저의 질문이 어느 챕터에 해당하는지 알지 못해, 특정 챕터를 지정하지 않은 채 질문 드린 점 양해 부탁드립니다.
제가 궁금한 점 및 전제조건은 다음과 같습니다.
폴더구조(8단계):
main폴더/sub폴더/sub-sub폴더/....../sub_sub_sub....폴더/ 맨 마지막 단계폴더들 중에서 특정 폴더의 사진목록을 추출하고 싶습니다.
마지막 단계 폴더들 중에서 특정 폴더 :
추출대상 폴더의 경로는 엑셀셀에 명기되어 있긴 합니다.
이렇게 추출된 사진을 폴더경로단위로 한/컴의 1페이지별 붙여넣기 할 예정입니다.
제가 수강 중인 인프런 강좌를 반복하면서 봐도 잘 해결되지 않네요.
강좌의 섹션 중 '학교명...지역명?' 에서 언듯 해결책을 느낀 것 같았지만 이내 벽에 부딪히게 되어 선생님께 문의 드리는 바 입니다.
좋은 해결 실마리가 있으면 조언 부탁드립니다.
감사합니다.
답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
조현우님, 여러 단계로 구성된 폴더 구조에서 특정 폴더의 이미지를 추출하는 과정은 업무 자동화에서 흔히 마주칠 수 있는 문제입니다.
os
모듈을 활용하여 폴더 경로를 탐색하고, os.walk()
를 사용하여 폴더 깊이 탐색을 자동화할 수 있습니다. 각 하위 폴더를 탐색하면서 파일 명을 가져와 이미지 파일만 필터링 할 수 있습니다.import os
def find_images(target_folder):
image_files = []
for root, _, files in os.walk(target_folder):
for file in files:
if file.endswith(('.png', '.jpg', '.jpeg')):
image_files.append(os.path.join(root, file))
return image_files
target_folder = "main폴더" # 최상위 폴더 경로
image_list = find_images(target_folder)
print(image_list)
pandas
라이브러리를 통해 엑셀 파일을 읽어와 경로 정보를 추출할 수 있습니다.import pandas as pd
def get_target_folders(excel_file, sheet_name):
df = pd.read_excel(excel_file, sheet_name=sheet_name)
return df['폴더경로열'].tolist() # 엑셀 내 경로가 있는 열
excel_file = '폴더경로.xlsx'
target_folders = get_target_folders(excel_file, 'Sheet1')
pywin32
모듈을 이용하여 한글과의 연동을 통해 자동화할 수 있습니다.관련 내용으로 더 많은 정보를 원한다면 다음 예제와 참고 게시물을 살펴보시길 바랍니다:
이 방법을 통해 조현우님께서 원하는 결과를 얻을 수 있기를 바랍니다. 문제의 해결을 위해 추가적인 정보가 필요하시면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
안녕하세요?
어려운 코드는 아니지만, 두 가지 주제로 분리해서 설명을 드려야 할 것 같습니다.
현재 폴더의 파일이나 폴더 목록은 os.listdir()
로 간편하게 구할 수 있지만,
하위 폴더의 파일 목록까지 한 번에 구하고 싶으시다면 os.walk()
라는 함수를 쓰시는 것이
훨씬 간편합니다.
예를 들어 하위폴더와 파일목록이 아래와 같을 때
아래와 같은 함수를 정의하여 실행하면
(경로명 키를 가진 dict를 정의했습니다. 각 값은 해당 경로의 jpg 파일의 절대경로 리스트입니다.)
import os
def get_jpg_files_by_directory(root_dir="."):
jpg_dict = {}
for dirpath, _, filenames in os.walk(root_dir):
jpg_files = [os.path.abspath(os.path.join(dirpath, f)) for f in filenames if f.lower().endswith(".jpg")]
if jpg_files: # 파일이 있는 폴더만 추가
jpg_dict[dirpath] = jpg_files
return jpg_dict
결과는 아래와 같습니다.
>>> jpg_files_dict = get_jpg_files_by_directory()
>>> print(jpg_files_dict)
{
'.\\sub1': [
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\A-1.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\A-2.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\A-3.jpg'
],
'.\\sub1\\sub2': [
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\B-1.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\B-2.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\B-3.jpg'
],
'.\\sub1\\sub2\\sub3': [
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\C-1.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\C-2.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\C-3.jpg'
],
'.\\sub1\\sub2\\sub3\\sub4': [
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\sub4\\D-1.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\sub4\\D-2.jpg',
'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\sub4\\D-3.jpg'
]
}
위와 같은 데이터구조를 만들면,
하위경로별로 각각의 key가 있고 그 안에 값으로 jpg파일 리스트가 있으므로
순차적으로 이미지를 삽입하기 쉽습니다. (물론 더 효율적인 좋은 방법이 있을 수도 있습니다.)
아래아한글 API가 다소 복잡하므로, 저는 최근에 거의 항상 pyhwpx
모듈을 이용해서
간단한 명령어들을 처리하고 있습니다.
pyhwpx 모듈에 대한 구체적인 설명은 위키독스(링크)에서 확인하실 수 있습니다.
pyhwpx에서는
hwp.create_table(rows, cols, treat_as_char)
로 간편하게 표를 생성하고,
hwp.insert_picture(img)
메서드로 셀 안에서 이미지를 삽입하실 수 있습니다.
아래는 pyhwpx를 통해 위 이미지 목록을 간단히 hwp 파일에 삽입하는 예시코드입니다.
for k in jpg_files_dict.keys():
hwp.set_font(Height=25) # 글자크기를 25로
hwp.insert_text(k) # 경로명 삽입
hwp.BreakPara() # 엔터
hwp.create_table(rows=1, cols=1, treat_as_char=True) # 1x1의 글자취급표 생성
for img in jpg_files_dict[k]: # 경로명 키를 순회하면서
hwp.insert_picture(img) # 경로 내의 jpg파일 삽입
hwp.TableAppendRow() # 아래에 새 셀 생성
hwp.Run("TableSubtractRow") # 마지막에 생성된 빈 셀은 제거
hwp.MoveDown() # 표 아래로 내려가서
hwp.BreakPage() # Ctrl-Enter(페이지 나누기)
이런 식으로 활용하실 수 있습니다.
라인별 주석을 참고해주시기 바랍니다.
엑셀 파일에 경로가 명시되어 있다면 해당 엑셀파일을 판다스 등으로 가져오셔서
os.walk나 위 dict 자료 대신 활용하시면 더 간편할 것입니다.
부디 도움이 되었길 바랍니다.
추가 질문은 댓글로 남겨주세요.
사실, 질문이 조금 두루뭉실한 느낌입니다.
샘플 데이터가 있으면 확실하게 코드로 보여드릴 수 있는데,
아시겠지만ㅜ 제가 똑똑한 편이 아니어서ㅎㅎㅎ
질문 자체를 이해하는 것도 상당한 에너지가 필요하네요ㅜ
행복한 하루 보내시기 바랍니다!
안녕하세요. 선생님
바쁜 가운데 답을 주셨어 감사합니다.
파이썬 공부가 좀 많이 어렵네요. 그기에 한/글 프로그램에 연동시킬려니....더 힘드네요.
말씀처럼 저의 질문이 두루뭉실 하여, 선생님께서 질문의 요지 파악하시기 힘드실거라 충분히 이해합니다.
가르쳐주신 내용을 좀더 연구해 보고 해결되지 않으면 다시 도움 요청 드릴게요.
감사합니다.