🗄️ 데이터센터
home
주식거래 데이터
home

파일 읽고 병합하기

파일읽기

glob으로 원하는 파일 리스트를 얻은 다음, for문으로 순회하면서 read_excel로 세금계산서 내역을 데이터프레임으로 읽을 수 있습니다. 하지만 단순히 읽기만 하면 안 되고, 파일들을 병합해야 합니다. 데이터프레임을 별도 리스트에 누적하고 병합하겠습니다.

파일누적

1. dfs리스트에 DataFrame누적

엑셀 파일들을 읽어서 하나의 데이터프레임 리스트로 만드는 과정입니다. 먼저 빈 리스트 dfs를 만들어 데이터프레임들을 담을 준비를 합니다. 그리고 glob.glob() 함수를 사용해 현재 디렉토리에서 '매출전자세금계산서목록'이라는 문자열이 포함된 모든 .xls 확장자 파일들을 찾아냅니다.
찾아낸 파일들은 for 반복문을 통해 하나씩 처리됩니다. 각 파일은 pandas의 read_excel() 함수로 읽어들이는데, 이때 header=5 옵션을 주어 실제 데이터가 시작되는 6번째 행부터 읽도록 설정합니다. 읽어들인 각각의 데이터프레임은 temp 변수에 임시 저장된 후, append() 메소드를 통해 dfs 리스트에 추가됩니다.
마지막으로 완성된 dfs 리스트를 출력하면, 모든 엑셀 파일들의 데이터가 각각의 데이터프레임 형태로 저장된 리스트를 확인할 수 있습니다.
import glob dfs = [] taxFiles = glob.glob('*매출전자세금계산서목록*.xls') for file in taxFiles: temp = pd.read_excel(file, header=5) dfs.append(temp) dfs
Python
복사

2. 1의코드 개선

위 코드는 첫 번째 코드를 더 간결하고 효율적으로 개선한 버전입니다. 먼저 pandas를 pd라는 별칭으로 명시적으로 임포트하여 코드의 의도를 더 명확하게 보여줍니다.
가장 큰 변화는 for 루프와 append() 메소드를 사용하는 대신 리스트 컴프리헨션을 활용한 것입니다. [pd.read_excel(file, header=5) for file in taxFiles] 이 한 줄로 이전 코드의 여러 줄을 대체했습니다. 이는 파이썬의 특징을 잘 활용한 더 우아한 해결방식입니다.
또한 temp와 같은 임시 변수를 제거하여 코드의 가독성을 높였습니다. 결과적으로 동일한 기능을 수행하지만, 더 파이썬스러운 방식으로 작성된 코드가 완성되었습니다.
import glob import pandas as pd taxFiles = glob.glob('*매출전자세금계산서목록*.xls') dfs = [pd.read_excel(file, header=5) for file in taxFiles] dfs
Python
복사

파일병합

파일 병합 단계에서는 앞서 생성한 데이터프레임들의 리스트(dfs)를 하나의 큰 데이터프레임으로 통합합니다. 이를 위해 pandasconcat() 함수를 사용합니다.
concat() 함수는 여러 데이터프레임을 하나로 연결하는 기능을 수행합니다. 기본적으로 위아래로 데이터를 쌓는 방식(수직 결합)으로 동작하며, 이는 각 엑셀 파일의 데이터가 순차적으로 하나의 큰 데이터프레임에 추가되는 것을 의미합니다.
결과적으로 모든 엑셀 파일의 데이터가 통합된 하나의 데이터프레임 df가 생성됩니다. 이렇게 생성된 df는 모든 파일의 데이터를 포함하고 있어, 전체 데이터를 한 번에 분석하거나 처리하는 것이 가능해집니다.
import glob import pandas as pd taxFiles = glob.glob('*매출전자세금계산서목록*.xls') dfs = [pd.read_excel(file, header=5) for file in taxFiles] df = pd.concat(dfs) # pandas concat참고 df
Python
복사

홈택스와 ERP세금계산서

개별 변수명

앞서 살펴본 파일 병합 코드를 활용하여 홈택스ERP 세금계산서 내역을 하나의 데이터프레임으로 준비합니다. 변수에 데이터프레임을 저장할 때는 구분하기 쉽도록 TAX, ERP와 같이 명확한 이름을 사용하는 것이 좋습니다.
import glob import pandas as pd # 택스 taxFiles = glob.glob('*매출전자세금계산서목록*.xls') dfs = [pd.read_excel(file, header=5) for file in taxFiles] HTS = pd.concat(dfs) # ERP erpFiles = glob.glob('*부가세수정_매출*.xls') dfs = [pd.read_excel(file) for file in taxFiles] ERP = pd.concat(dfs)
Python
복사

최종 함수화

위의 코드를 함수로 개선하면 다음과 같이 작성할 수 있습니다. header는 각 파일에서 실제 데이터가 시작되는 행을 지정합니다. 예를 들어, ERP에서 받은 파일의 데이터가 4번째 행에서 시작되므로 header를 3으로 설정했습니다. 반드시 본인의 파일 구조를 확인하고 적절한 header 값을 설정하세요. 또한 파일이 xls인지 xlsx 포맷인지 확인하거나, 파일명이 고유하다면 확장자를 생략할 수도 있습니다.
import glob import pandas as pd # 파일 읽기 및 통합 함수 def readFiles(pattern, header=None): files = glob.glob(pattern) data = [pd.read_excel(f, header=header) for f in files] return pd.concat(data, ignore_index=True) # 택스 파일 처리 hts = readFiles('*매출전자세금계산서목록*.xls', header=5) # ERP 파일 처리 erp = readFiles('부가세수정_매출*.xlsx', header=3)
Python
복사