From e6e101d0b8542e1aae7ada6eb568c3999687ef3f Mon Sep 17 00:00:00 2001 From: Seowonryeol <90122460+Seowonryeol@users.noreply.github.com> Date: Tue, 8 Aug 2023 13:01:04 +0900 Subject: [PATCH] 20230808 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 그동안의 업그레이드 사항 업로드 --- ...04\353\241\234\352\267\270\353\236\250.py" | 171 +++++++++++++++++ ...04\353\241\234\352\267\270\353\236\250.py" | 134 ++++++++++++++ ...04\353\241\234\352\267\270\353\236\250.py" | 172 +++++++++--------- ...04\353\241\234\352\267\270\353\236\250.py" | 25 +++ ...04\353\241\234\352\267\270\353\236\250.py" | 74 ++++++++ 5 files changed, 490 insertions(+), 86 deletions(-) create mode 100644 "(xlsx \355\214\214\354\235\274 \353\202\264 \355\225\231\354\203\235 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) \354\213\254\355\231\224 R&D \354\235\270\352\261\264\353\271\204 \354\247\200\352\270\211 \354\204\234\353\245\230 pdf \355\206\265\355\225\251 \355\224\204\353\241\234\352\267\270\353\236\250.py" create mode 100644 "(xlsx\353\202\264 \355\214\214\354\235\274 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) bi-weekly \355\206\265\355\225\251 pdf \353\263\264\352\263\240\354\204\234 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" create mode 100644 "\355\214\214\354\235\264\354\215\254 \354\233\271\354\202\254\354\235\264\355\212\270 \355\201\254\353\241\244\353\247\201 \353\260\217 \354\271\264\354\271\264\354\230\244\355\206\241 \354\240\204\354\206\241 \355\224\204\353\241\234\352\267\270\353\236\250.py" create mode 100644 "\355\214\214\354\235\274\353\223\244\354\235\230 \354\265\234\354\242\205\354\210\230\354\240\225 \353\202\240\354\247\234, \352\270\260\354\227\205\353\252\205, \355\225\231\353\262\210, \354\235\264\353\246\204, \352\262\275\353\241\234\353\245\274 EXCEL \355\214\214\354\235\274\353\241\234 \354\266\224\354\266\234\355\225\230\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\250.py" diff --git "a/(xlsx \355\214\214\354\235\274 \353\202\264 \355\225\231\354\203\235 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) \354\213\254\355\231\224 R&D \354\235\270\352\261\264\353\271\204 \354\247\200\352\270\211 \354\204\234\353\245\230 pdf \355\206\265\355\225\251 \355\224\204\353\241\234\352\267\270\353\236\250.py" "b/(xlsx \355\214\214\354\235\274 \353\202\264 \355\225\231\354\203\235 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) \354\213\254\355\231\224 R&D \354\235\270\352\261\264\353\271\204 \354\247\200\352\270\211 \354\204\234\353\245\230 pdf \355\206\265\355\225\251 \355\224\204\353\241\234\352\267\270\353\236\250.py" new file mode 100644 index 0000000..6a2bff1 --- /dev/null +++ "b/(xlsx \355\214\214\354\235\274 \353\202\264 \355\225\231\354\203\235 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) \354\213\254\355\231\224 R&D \354\235\270\352\261\264\353\271\204 \354\247\200\352\270\211 \354\204\234\353\245\230 pdf \355\206\265\355\225\251 \355\224\204\353\241\234\352\267\270\353\236\250.py" @@ -0,0 +1,171 @@ +import os +import pandas as pd +from PyPDF2 import PdfMerger + + +def get_all_files(directory): # 디렉토리 내의 모든 파일을 검색해 리턴함 + all_files = [] + + # os.walk() 함수를 사용하여 디렉토리를 순회하면서 파일들을 찾음 + for root, _, files in os.walk(directory): + for file in files: + # 파일의 절대 경로를 생성하여 리스트에 추가 + file_path = os.path.join(root, file) + all_files.append(file_path) + + return all_files + + +def get_data_from_excel_column(df, column_name): + """ + 엑셀 파일에서 column_name 키워드가 포함된 셀을 찾고, 해당 셀 아래에 있는 이름 데이터를 가져오는 함수. + + Parameters: + df (str): 엑셀 파일에서 읽어 만들어진 df + column name (str): 데이터를 찾고자하는 열의 헤더(이름) ex) 학번, 이름 + + Returns: + list: 엑셀 파일에서 찾은 헤더 하위의 데이터들을 담은 리스트. + """ + + # column_name을 포함한 셀 찾기 + student_number_cell = df.apply( + lambda row: row.astype(str).str.contains(column_name, case=False) + ).any() + + # column_name이라고 적힌 셀의 위치 + if student_number_cell.any(): + name_column_index = student_number_cell.where(student_number_cell == True).first_valid_index() + else: + raise ValueError(f"Couldn't find a column with the name '{column_name}'.") + + name_row = df[df[name_column_index] == column_name].index[0] + + # '이름'이라고 적힌 셀의 아래쪽 셀들에 있는 데이터 가져오기 + names = df.loc[name_row + 1 :, name_column_index].tolist() + # 문자열 형태인 값을 반환 + return list(map(str, names)) + + +def create_folder(path): + try: + # 폴더가 이미 존재하지 않는 경우에만 폴더를 생성합니다. + if not os.path.exists(path): + os.makedirs(path) + print(f"'{path}' 디렉토리가 성공적으로 생성되었습니다.") + else: + print(f"'{path}' 디렉토리는 이미 존재합니다.") + except OSError as e: + print(f"디렉토리 '{path}' 생성 실패. 오류 내용: {e}") + + +# 탐색하고 병합해야할 파일의 종류들과 출력 파일에 들어가야할 이름들 +file_types_undergraduate = ["개인", "신분증", "통장"] +file_types_graduate = ["개인", "신분증", "통장", "청렴서약", "건강"] +file_types_output = ["개인정보수집이용제공 동의서", "신분증, 통장 사본", "청렴서약서", "건강보험자격득실확인서"] + +print( + f"이 프로그램은 학부생/대학원생의 심화R&D 인건비 지급서류들('신분증 사본', '통장 사본' 등)을 주어진 엑셀 파일의 학생 이름 순서에 따라" + " 각 서류별로 하나의 pdf로 합쳐 만들어주는 프로그램입니다. (학부생/대학원생 구분) ex) 신분증, 통장사본-학부생.pdf, 개인정보동의서-학부생.pdf\n" + "학생들의 정보가 담긴 엑셀 파일명을 절대경로로 입력하세요. 확장자 포함해야합니다. 학부생 sheet가 1번, 대학원생 sheet가 2번 시트여야합니다. ex) c:/user/심화 R&D 엑셀.xlsx\n절대 경로를 포함한 파일명 : ", + end="", +) +# 정보를 읽어들일 엑셀파일의 이름 입력 +excel_file_name = input() + +#파일을 병합할 때 기준이 되는 열 입력 +print("파일 병합 기준이 되는 열의 이름을 입력하세요. 그 열의 데이터 순서대로 파일이 병합됩니다. ex)이름, 학번 : ", end="") +column_name=input() + +# 학부생/대학원생의 엑셀 파일 읽기 +df_undergraduate = pd.read_excel(excel_file_name, sheet_name=0, header=None) +df_graduate = pd.read_excel(excel_file_name, sheet_name=1, header=None) + +# '이름'이라는 글자를 포함한 열 찾기 +undergraduate_std_num = get_data_from_excel_column(df_undergraduate, column_name) +graduate_std_num = get_data_from_excel_column(df_graduate, column_name) + +# 프로그램이 실행될 폴더 경로 입력 +print("프로그램이 실행돼야하는 폴더의 경로를 절대경로로 입력하세요 ex) c:/user/산학R&D\n폴더 절대 경로 : ", end="") + +# 특정 폴더의 모든 파일 얻기 +abs_practice_folder_path = input() + +print( + "파일이 저장될 폴더의 절대 경로를 입력하세요. 프로그램 실행 위치와 동일하다면 바로 엔터키를 눌러주세요.폴더가 자동 생성되지 않으니 폴더를 생성하고 경로를 입력해주세요 ex)c:/user/산학R&D/7월 \n 폴더 절대경로 :", + end="", +) + +#pdf 파일이 저장될 절대 경로 입력 +pdf_created_abs_practice_folder_path = input() +if pdf_created_abs_practice_folder_path == "": + pdf_created_abs_practice_folder_path = abs_practice_folder_path +files = get_all_files(abs_practice_folder_path) + +# 학부생 개인정보 동의서에 대해 pdf 파일 생성 +merger = PdfMerger() +cnt = 0 +for name in undergraduate_std_num: + for file in files: + file_basename = os.path.basename(file) + if name in file_basename and "개인" in file_basename: + merger.append(os.path.join(abs_practice_folder_path, file)) + print(file_basename + " 병합 완료") + cnt += 1 +merger.write(os.path.join(pdf_created_abs_practice_folder_path, f"개인정보이용동의서_학부생.pdf")) +print(f"총 {cnt}개의 파일, 개인정보이용동의서_학부생.pdf 파일 생성완료\n") +merger.close() + +# 학부생 각 통장사본, 신분증 사본 파일 유형에 대해 pdf 파일 생성 +merger = PdfMerger() +cnt = 0 +for name in undergraduate_std_num: + for file_type in file_types_undergraduate[1:]: + for file in files: + file_basename = os.path.basename(file) + if name in file_basename and file_type in file_basename: + print(file_basename + " 병합 완료") + merger.append(os.path.join(abs_practice_folder_path, file)) + cnt += 1 +merger.write(os.path.join(pdf_created_abs_practice_folder_path, f"신분증, 통장 사본_학부생.pdf")) +print(f"총 {cnt}개의 파일신분증, 통장 사본 - 학부생.pdf 파일 생성완료\n") +merger.close() + +# 대학원생 통장사본, 신분증 사본을 제외한 파일 유형에 대해 pdf 파일 생성 +indices = [0, 3, 4] +for index in indices: + merger = PdfMerger() + cnt = 0 + for name in graduate_std_num: + for file in files: + file_type = file_types_graduate[index] + file_basename = os.path.basename(file) + if name in file_basename and file_type in file_basename: + merger.append(os.path.join(abs_practice_folder_path, file)) + print(file_basename + " 병합 완료") + cnt += 1 + output_index = index - 1 if index > 0 else 0 + merger.write( + os.path.join( + pdf_created_abs_practice_folder_path, f"{file_types_output[output_index]}_대학원생.pdf" + ) + ) + print(f"총 {cnt}개의 파일, {file_types_output[output_index]}_대학원생.pdf 파일 생성완료\n") + merger.close() + +# 대학원생 통장사본, 신분증 사본 파일 유형에 대해 pdf 파일 생성 +merger = PdfMerger() +cnt = 0 +for name in graduate_std_num: + for file in files: + for file_type in file_types_graduate[1:3]: + file_basename = os.path.basename(file) + if name in file_basename and file_type in file_basename: + print(file_basename + " 병합 완료") + merger.append(os.path.join(abs_practice_folder_path, file)) + cnt += 1 +merger.write(os.path.join(pdf_created_abs_practice_folder_path, f"통장 사본, 신분증 사본_대학원생.pdf")) +merger.close() +print(f"총 {cnt}개의 파일, 통장 사본, 신분증 사본_대학원생.pdf 파일 생성완료") +# 프로그램 종료 +input("프로그램을 종료하려면 아무 키나 누르세요") diff --git "a/(xlsx\353\202\264 \355\214\214\354\235\274 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) bi-weekly \355\206\265\355\225\251 pdf \353\263\264\352\263\240\354\204\234 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" "b/(xlsx\353\202\264 \355\214\214\354\235\274 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) bi-weekly \355\206\265\355\225\251 pdf \353\263\264\352\263\240\354\204\234 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" new file mode 100644 index 0000000..3b6e4bb --- /dev/null +++ "b/(xlsx\353\202\264 \355\214\214\354\235\274 \354\210\234\354\204\234\354\227\220 \353\224\260\353\245\270) bi-weekly \355\206\265\355\225\251 pdf \353\263\264\352\263\240\354\204\234 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" @@ -0,0 +1,134 @@ +import os +import re +from datetime import datetime +from docx import Document +from fpdf import FPDF +import comtypes.client +from PyPDF2 import * +import sys +import pandas as pd +import openpyxl + +#월, 차수 넣으면 각 파일 pdf파일 생성 +#특정 달에 해당하는 모든 word 파일을 하나로 통합한 pdf파일 생성 +#각각 해서 총 2개로, 안 되면 둘 중 하나 + +def merge_pdfs_according_to_xlsx_file(xlsx_file_path, input_files_1,input_files_2, output_file, month): #1차 폴더와 2차 폴더 내의 pdf를 하나하나 순서를 입력해서 합쳐주는 함수 + merger = PdfMerger() + for (i, input_file) in enumerate(input_files_1, 1): + print(str(i)+". " +input_file) #1차 폴더 내에 있는 모든 pdf 이름을 출력 + for i in range(1, len(input_files_1)+1): + file_select_num=int(input("번호를 입력하세요 : "))-1 #1차 폴더 내에 있는 pdf 중 병합할 pdf를 선택 + if file_select_num==100: + file_name=input("파일 이름을 입력하세요 : ")+".pdf" + merger.write(file_name) + merger.close() + print("병합을 완료하였습니다") + input() + sys.exit() + + merger.append("./"+str(month)+"월 1차 bi-weekly 보고서 리스트/" + input_files_1[file_select_num]) #1차 폴더에 있는 pdf를 병합 + elements_1 = re.split(r'\s+|_|-| |\\', input_files_1[file_select_num]) #1차 파일 이름을 요소별로 분해 + print("./"+str(month)+"월 1차 bi-weekly 보고서 리스트\\"+ input_files_1[file_select_num]+"파일이 추가되었습니다.") + for input_file_2 in input_files_2: + student_id_1=[word for word in elements_1 if '20' in word][1] #1차 파일의 학번 반환 + elements_2 = re.split(r'\s+|_|-| |\\', input_file_2) #2차 파일 이름을 요소별로 분해 + student_id_2=[word for word in elements_2 if '20' in word][1] #2차 파일의 학번 반환 + if (student_id_1==student_id_2): #2차 폴더 내의 pdf가 1차 폴더 내 pdf의 학번이 같다면 + merger.append("./"+str(month)+"월 2차 bi-weekly 보고서 리스트/" + input_file_2) #2차 폴더에 있는 pdf를 병합 + print("./"+str(month)+"월 2차 bi-weekly 보고서 리스트\\"+input_file_2+" 파일이 추가되었습니다.") + break + if(i%10==0): + file_name=input("파일 이름을 입력하세요 : ")+".pdf" + merger.write(file_name) + merger.close() + print("병합을 완료하였습니다") + input() + sys.exit() + +def get_all_files_with_extension(directory, extension): # 디렉토리 내의 모든 파일을 검색해 리턴함 + all_files = [] + + # os.walk() 함수를 사용하여 디렉토리를 순회하면서 파일들을 찾음 + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(extension): + # 파일의 절대 경로를 생성하여 리스트에 추가 + file_path = os.path.join(root, file) + all_files.append(file_path) + return all_files + +def get_data_from_excel_column(df, column_name): + """ + 엑셀 파일에서 column_name 키워드가 포함된 셀을 찾고, 해당 셀 아래에 있는 이름 데이터를 가져오는 함수. + + Parameters: + df (str): 엑셀 파일에서 읽어 만들어진 df + column name (str): 데이터를 찾고자하는 열의 헤더(이름) ex) 학번, 이름 + + Returns: + list: 엑셀 파일에서 찾은 헤더 하위의 데이터들을 담은 리스트. + """ + + # column_name을 포함한 셀 찾기 + student_number_cell = df.apply( + lambda row: row.astype(str).str.contains(column_name, case=False) + ).any() + + # column_name이라고 적힌 셀의 위치 + if student_number_cell.any(): + name_column_index = student_number_cell.where(student_number_cell == True).first_valid_index() + else: + raise ValueError(f"Couldn't find a column with the name '{column_name}'.") + + name_row = df[df[name_column_index] == column_name].index[0] + + # '이름'이라고 적힌 셀의 아래쪽 셀들에 있는 데이터 가져오기 + names = df.loc[name_row + 1 :, name_column_index].tolist() + # 문자열 형태인 값을 반환 + return list(map(str, names)) + + +print("/n입력하는 월 1차 bi-weekly 보고서 리스트와 2차 bi-weekly 보고서 리스트 폴더 내의 모든 보고서 pdf 파일들을 각 사람별 1,2차를 붙여 생성합니다." + " 선생님께서 주신 산학협력프로젝트 xlsx 순서에 맞게 pdf를 합쳐줍니다. 폴더 내 기존 파일의 순서와 다릅니다." + "ex) 서원렬 5월 1차.pdf + 서원렬 5월 2차.pdf + 고선희 5월 1차.pdf 순서\n") +month=input("원하는 달을 입력하세요 (ex)5월의 경우 : 5) :") #프로그램 설명 및 월 입력 +abs_practice_folder_path = input("프로그램이 실행되어야할 절대경로를 입력하세요. 해당 폴더에 xlsx파일도 있어야합니다. ex) C:/sunny : ") #프로그램이 실행될 절대 경로 입력 + +xlsx_files=[] + +for file in os.listdir(abs_practice_folder_path): #폴더 내에서 xlsx 엑셀 파일 탐색 + if file.endswith(".xlsx"): + xlsx_files.append(file) + +for (i, xlsx_file) in enumerate(xlsx_files, 1): #xlsx 파일명 출력 및 참조할 xlsx 파일 입력받음 + print(str(i)+". "+ xlsx_file) +xlsx_file_num=int(input("위 파일들 중 참조하고자 하는 xlsx 파일 번호를 입력하세요 : ")) +xlsx_file_path=abs_practice_folder_path+"/"+xlsx_files[xlsx_file_num-1] + +#파일을 병합할 때 기준이 되는 열 입력 +print("파일 병합 기준이 되는 열의 이름을 입력하세요. 그 열의 데이터 순서대로 파일이 병합됩니다. ex)이름, 학번 : ", end="") +column_name=input() + +df_students = pd.read_excel(xlsx_file_path, sheet_name=0, header=None) +students_num=get_data_from_excel_column(df_students, column_name) #엑셀 파일 참조 후 df 생성 + +files=get_all_files_with_extension(abs_practice_folder_path,".pdf") + +print(xlsx_file_path, students_num, files) + +merger = PdfMerger() +cnt = 0 +for student_num in students_num: + for file in files: + file_basename = os.path.basename(file) + if student_num in file_basename and str(month) in file_basename: + merger.append(os.path.join(abs_practice_folder_path, file)) + print(file_basename + " 병합 완료") + cnt += 1 +merger.write(os.path.join(abs_practice_folder_path, f"(산학협력프로젝트 Bi-weekly 보고서 제출 현황.xlsx에 따른) {month}월 bi-weekly 보고서 통합본.pdf")) +print(f"총 {cnt}개의 파일, (산학협력프로젝트 Bi-weekly 보고서 제출 현황.xlsx에 따른) %d월 bi-weekly 보고서 통합본.pdf 생성 완료\n") +merger.close() + +input("프로그램을 종료하려면 아무 키나 누르세요") +#merge_pdfs_according_to_xlsx_file(xlsx_file_path, items_1, items_2, "(산학협력프로젝트 Bi-weekly 보고서 제출 현황.xlsx에 따른) %d월 bi-weekly 보고서 통합본.pdf" %month, month) #pdf merge 실행 \ No newline at end of file diff --git "a/O\354\233\224 O\354\260\250 bi-weekly \353\263\264\352\263\240\354\204\234 \355\217\264\353\215\224 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" "b/O\354\233\224 O\354\260\250 bi-weekly \353\263\264\352\263\240\354\204\234 \355\217\264\353\215\224 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" index f8ba2c3..42469f0 100644 --- "a/O\354\233\224 O\354\260\250 bi-weekly \353\263\264\352\263\240\354\204\234 \355\217\264\353\215\224 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" +++ "b/O\354\233\224 O\354\260\250 bi-weekly \353\263\264\352\263\240\354\204\234 \355\217\264\353\215\224 \354\203\235\354\204\261 \355\224\204\353\241\234\352\267\270\353\236\250.py" @@ -1,86 +1,86 @@ -import os -import shutil - - -# 0이 제일 하위경로, 숫자가 커질수록 앞경로 0,0 넣으면 파일명 반환 1,1 최하위 폴더 반환 -def get_sub_paths(path, start_level, end_level): - """ - 주어진 경로에서 start_level부터 end_level까지의 중간 경로 요소를 반환합니다. - """ - all_folders = [] - level = 0 - while level < start_level: - path, _ = os.path.split(path) - level += 1 - - while level <= end_level: - path, folder = os.path.split(path) - if folder != "": - all_folders.append(folder) - else: - break - level += 1 - all_folders.reverse() - - return os.path.join(*all_folders) - - -def get_folder_depth(path): - """ - 주어진 경로의 폴더 깊이를 반환합니다. 현재 경로에서 root폴더면 0, 그 이상부터 +1 - """ - depth = 0 - while True: - path, folder = os.path.split(path) - if folder != "": - depth += 1 - else: - break - return depth-1 - - -def create_folder(folder_path): - try: - os.mkdir(folder_path) - # except FileExistsError as e: - # print("폴더가 이미 존재합니다.") - except Exception as e: - print("", str(e)) - - -# 디렉토리와 하위폴더 내 전체 파일의 경로+이름을 반환하는 함수 -def get_all_files(directory, month, level): - all_files = [] - # 디렉토리 내의 파일과 폴더 목록을 가져옴 - items = os.listdir(directory) - - for item in items: # 디렉토리 내의 모든 파일, 폴더에 대해 - item_path = os.path.join(directory, item) - if (os.path.isfile(item_path) and item_path.find(str(month) + "월") != -1 and item_path.find(str(level) + "차") != -1 - ): # 조건에 맞는 파일 반환 - # 파일인 경우 파일 목록에 추가 - if "~$" not in item and "~" not in item: - all_files.append(item_path) - elif os.path.isdir(item_path): - # 폴더인 경우 재귀적으로 폴더 안의 파일 목록을 가져옴 - # print(item_path+" 폴더가 성공적으로 등록되었습니다.") - subfolder_files = get_all_files(item_path, month, level) - all_files.extend(subfolder_files) - return all_files - - -month, level = map( - int, input("원하는 달과 차수를 콤마를 두고 입력하세요 (ex)5월 1차의 경우 : 5, 1) : ").split(",") -) -bi_weekly_folder="./bi-weekly 보고서 " + str(month) + "월 " + str(level) + "차/" -files_path = get_all_files("./", month, level) -create_folder(bi_weekly_folder) -for file_path in files_path: - if(get_folder_depth(file_path)==5): #교수님명, 기업명 폴더 생성 - if(len(get_sub_paths(file_path,4,4))>=3 and len(get_sub_paths(file_path,4,4))<=4): - create_folder(bi_weekly_folder+get_sub_paths(file_path,4,4)) - create_folder(bi_weekly_folder+get_sub_paths(file_path,4,4)+'/'+get_sub_paths(file_path,2,2)) -for file_path in files_path: - if(get_folder_depth(file_path)==5): - if(os.path.isfile(file_path) and len(get_sub_paths(file_path,4,4))>=3 and len(get_sub_paths(file_path,4,4))<=4): - shutil.copy(file_path,os.path.join(bi_weekly_folder,get_sub_paths(file_path,4,4),get_sub_paths(file_path,2,2))) +import os +import shutil + + +# 0이 제일 하위경로, 숫자가 커질수록 앞경로 0,0 넣으면 파일명 반환 1,1 최하위 폴더 반환 +def get_sub_paths(path, start_level, end_level): + """ + 주어진 경로에서 start_level부터 end_level까지의 중간 경로 요소를 반환합니다. + """ + all_folders = [] + level = 0 + while level < start_level: + path, _ = os.path.split(path) + level += 1 + + while level <= end_level: + path, folder = os.path.split(path) + if folder != "": + all_folders.append(folder) + else: + break + level += 1 + all_folders.reverse() + + return os.path.join(*all_folders) + + +def get_folder_depth(path): + """ + 주어진 경로의 폴더 깊이를 반환합니다. 현재 경로에서 root폴더면 0, 그 이상부터 +1 + """ + depth = 0 + while True: + path, folder = os.path.split(path) + if folder != "": + depth += 1 + else: + break + return depth-1 + + +def create_folder(folder_path): + try: + os.mkdir(folder_path) + # except FileExistsError as e: + # print("폴더가 이미 존재합니다.") + except Exception as e: + print("", str(e)) + + +# 디렉토리와 하위폴더 내 전체 파일의 경로+이름을 반환하는 함수 +def get_all_files(directory, month, level): + all_files = [] + # 디렉토리 내의 파일과 폴더 목록을 가져옴 + items = os.listdir(directory) + + for item in items: # 디렉토리 내의 모든 파일, 폴더에 대해 + item_path = os.path.join(directory, item) + if (os.path.isfile(item_path) and item_path.find(str(month) + "월") != -1 and item_path.find(str(level) + "차") != -1 + ): # 조건에 맞는 파일 반환 + # 파일인 경우 파일 목록에 추가 + if "~$" not in item and "~" not in item: + all_files.append(item_path) + elif os.path.isdir(item_path): + # 폴더인 경우 재귀적으로 폴더 안의 파일 목록을 가져옴 + # print(item_path+" 폴더가 성공적으로 등록되었습니다.") + subfolder_files = get_all_files(item_path, month, level) + all_files.extend(subfolder_files) + return all_files + + +month, level = map( + int, input("원하는 달과 차수를 콤마를 두고 입력하세요 (ex)5월 1차의 경우 : 5, 1) : ").split(",") +) +bi_weekly_folder="./bi-weekly 보고서 " + str(month) + "월 " + str(level) + "차/" +files_path = get_all_files("./", month, level) +create_folder(bi_weekly_folder) +for file_path in files_path: + if(get_folder_depth(file_path)==5): #교수님명, 기업명 폴더 생성 + if(len(get_sub_paths(file_path,4,4))>=3 and len(get_sub_paths(file_path,4,4))<=4): + create_folder(bi_weekly_folder+get_sub_paths(file_path,4,4)) + create_folder(bi_weekly_folder+get_sub_paths(file_path,4,4)+'/'+get_sub_paths(file_path,2,2)) +for file_path in files_path: + if(get_folder_depth(file_path)==5): + if(os.path.isfile(file_path) and len(get_sub_paths(file_path,4,4))>=3 and len(get_sub_paths(file_path,4,4))<=4): + shutil.copy(file_path,os.path.join(bi_weekly_folder,get_sub_paths(file_path,4,4),get_sub_paths(file_path,2,2))) diff --git "a/\355\214\214\354\235\264\354\215\254 \354\233\271\354\202\254\354\235\264\355\212\270 \355\201\254\353\241\244\353\247\201 \353\260\217 \354\271\264\354\271\264\354\230\244\355\206\241 \354\240\204\354\206\241 \355\224\204\353\241\234\352\267\270\353\236\250.py" "b/\355\214\214\354\235\264\354\215\254 \354\233\271\354\202\254\354\235\264\355\212\270 \355\201\254\353\241\244\353\247\201 \353\260\217 \354\271\264\354\271\264\354\230\244\355\206\241 \354\240\204\354\206\241 \355\224\204\353\241\234\352\267\270\353\236\250.py" new file mode 100644 index 0000000..9d0f1f3 --- /dev/null +++ "b/\355\214\214\354\235\264\354\215\254 \354\233\271\354\202\254\354\235\264\355\212\270 \355\201\254\353\241\244\353\247\201 \353\260\217 \354\271\264\354\271\264\354\230\244\355\206\241 \354\240\204\354\206\241 \355\224\204\353\241\234\352\267\270\353\236\250.py" @@ -0,0 +1,25 @@ +import requests +from bs4 import BeautifulSoup + +def get_activities(): + url = 'https://www.youtube.com/watch?v=-TkoO8Z07hI' + try: + response = requests.get(url, verify=True) + response.raise_for_status() # 예외 발생 시 에러 처리를 위한 코드 추가 + soup = BeautifulSoup(response.content, 'html.parser') + + # 웹 페이지에서 필요한 정보를 추출하는 코드를 작성합니다. + # 예를 들어, 대외활동의 제목과 링크를 추출할 수 있습니다. + activities = [] + for activity_elem in soup.select('.activity-item'): + title = activity_elem.select_one('.activity-title').text.strip() + link = activity_elem.select_one('.activity-title')['href'] + activities.append({'title': title, 'link': link}) + + return activities + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return [] + +activities = get_activities() +print(activities) diff --git "a/\355\214\214\354\235\274\353\223\244\354\235\230 \354\265\234\354\242\205\354\210\230\354\240\225 \353\202\240\354\247\234, \352\270\260\354\227\205\353\252\205, \355\225\231\353\262\210, \354\235\264\353\246\204, \352\262\275\353\241\234\353\245\274 EXCEL \355\214\214\354\235\274\353\241\234 \354\266\224\354\266\234\355\225\230\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\250.py" "b/\355\214\214\354\235\274\353\223\244\354\235\230 \354\265\234\354\242\205\354\210\230\354\240\225 \353\202\240\354\247\234, \352\270\260\354\227\205\353\252\205, \355\225\231\353\262\210, \354\235\264\353\246\204, \352\262\275\353\241\234\353\245\274 EXCEL \355\214\214\354\235\274\353\241\234 \354\266\224\354\266\234\355\225\230\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\250.py" new file mode 100644 index 0000000..2a20150 --- /dev/null +++ "b/\355\214\214\354\235\274\353\223\244\354\235\230 \354\265\234\354\242\205\354\210\230\354\240\225 \353\202\240\354\247\234, \352\270\260\354\227\205\353\252\205, \355\225\231\353\262\210, \354\235\264\353\246\204, \352\262\275\353\241\234\353\245\274 EXCEL \355\214\214\354\235\274\353\241\234 \354\266\224\354\266\234\355\225\230\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\250.py" @@ -0,0 +1,74 @@ +import os +import re +import datetime +from datetime import datetime +import pandas as pd + + +def get_all_files(directory): #디렉토리와 하위폴더 내 전체 파일의 경로+이름을 반환하는 함수 + all_files = [] + + # 디렉토리 내의 파일과 폴더 목록을 가져옴 + items = os.listdir(directory) + + for item in items: + item_path = os.path.join(directory, item) + if os.path.isfile(item_path): + # 파일인 경우 파일 목록에 추가 + all_files.append(item_path) + elif os.path.isdir(item_path): + # 폴더인 경우 재귀적으로 폴더 안의 파일 목록을 가져옴 + subfolder_files = get_all_files(item_path) + all_files.extend(subfolder_files) + + return all_files + +def get_file_modified_date(filename): #파일의 최종 수정날짜를 반환하는 함수 + modified_time = os.path.getmtime(filename) + modified_date = datetime.fromtimestamp(modified_time).date() + return modified_date +folders=[] +#입력 가이드 출력 및폴더명 입력 +print("excel 파일로 정보를 추출하고 싶은 폴더명을 입력하세요. 정확하게 입력하셔야합니다. (ex) 2021년 5월 1차의 경우 : 2021년 5월 1차)\n" + "폴더 명이 너무 길 경우 다른 폴더와 구분되는 폴더명의 일부만 입력하셔도 됩니다. (ex) 2021년 5월 1차의 경우 : 2021년 5월)") +folder_name=input("폴더명을 입력하세요 : ") + +#정보를 추출하고자 하는 폴더를 찾는 과정 +while(len(folders)!=1): #해당하는 폴더가 1개일 때까지 반복 + folders=[f for f in os.listdir('./') if os.path.isdir(f) and f.find(folder_name)!=-1] + #print(folders) + if(len(folders)==0): #폴더가 존재하지 않을 경우 + print("해당 폴더가 존재하지 않습니다. 다시 입력해주세요.\n폴더명 :", end="") + folder_name=input() + continue + elif len(folders)>=2: #폴더가 2개 이상일 경우 + for i, folder_name in enumerate(folders, start=1): + print(str(i) + ". " + folder_name) + print("중 하나를 선택하여 번호를 입력하세요 : ",end="") + folder_num=int(input()) + folder_name=folders[folder_num-1] + else: #폴더가 하나일 경우 + folder_name=folders[0] + print(folder_name+" 폴더에서 정보를 추출합니다.") + continue + +#확장자를 입력받음(* 입력 시 모든 확장자) +extensions = [ext.strip() for ext in input("해당 폴더 내에서 추출하고자 하는 파일의 확장자를 콤마를 두고 입력하세요. 모든 확장자를 원할 경우 공백을 입력하세요\n" + "(ex)docx, pdf의 경우 : docx, pdf) : ").split(',')] +#해당 폴더 내 파일들을 찾아서 파일명을 요소별로 분해하고, 요소들을 통해 정보를 추출하는 과정 +files = get_all_files("./"+folder_name) +file_paths=[] +file_infs=[] +for file_path in files: + if os.path.isfile(file_path) and (os.path.splitext(file_path)[1][1:] in extensions or extensions[0]==''): # 폴더가 아닌 파일만 처리, 선택한 확장자의 파일만 처리 + elements = re.split(r'\s+|_|-| |\\', os.path.basename(file_path)) #파일 이름을 요소별로 분해 + index_2023=[i for i, word in enumerate(elements) if '2023' in word][0] + student_id=[word for word in elements if '20' in word] + len_ele=len(elements) + modified_date = get_file_modified_date(file_path) + file_infs.append([elements[index_2023+4],student_id[1],modified_date,elements[index_2023+6],file_path]) + file_paths.append(file_path) +df=pd.DataFrame(file_infs,columns=["기업명","학번","최종수정날짜", "이름", "전체경로"]) +df.to_excel("./"+folder_name+ " 폴더 최종수정 날짜, 기업명, 학번, 이름, 경로 추출 EXCEL 파일.xlsx", index=False) +# for path in file_paths: +# print(path) \ No newline at end of file