728x90
반응형
[boto3][Pandas] s3에서 여러개의 파일을 읽어 하나의 df로 저장하기

데이터를 비교해야하는 업무가 있었는데, s3 버킷에 여러개의 csv 파일이 있었고 해당 파일을 하나의 df로 묶어
비교 대상과 비교해야했다.
나는 `boto3`를 이용하여 객체를 읽은 다음 df에 append 하는 방식으로 진행을 했는데 자세히 알아보자.
함수 정의
import pandas as pd
import boto3
from io import StringIO
def combine_csv_from_s3(bucket_name, prefix):
# S3 클라이언트 생성
s3 = boto3.client('s3')
# 지정된 prefix 아래의 모든 객체 목록을 가져옵니다.
response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
# CSV 파일을 저장할 리스트
dfs = []
# 각 객체를 반복하며 CSV 파일을 읽습니다.
for obj in response.get('Contents', []):
key = obj['Key']
if key.endswith('.csv'): # CSV 파일만 처리
# S3에서 객체를 다운로드하고 DataFrame으로 변환
csv_obj = s3.get_object(Bucket=bucket_name, Key=key)
body = csv_obj['Body'].read().decode('utf-8')
df = pd.read_csv(StringIO(body))
dfs.append(df)
# 모든 DataFrame을 하나로 합칩니다.
combined_df = pd.concat(dfs, ignore_index=True)
return combined_df
- `boto3`를 사용하여 S3에 접근한다.
- `list_objects_v2` 메서드를 사용하여 지정된 prefix의 모든 객체를 나열한다.
- 각 객체가 CSV 파일인지 확인한 후, `get_object` 메서드를 사용하여 파일을 읽고 DataFrame으로 변환한다.
- 모든 DataFrame을 `pd.concat()`으로 합친다.
# S3 버킷 이름과 파일의 prefix
bucket_name = 'your-bucket-name'
prefix = 'path/to/csv/files/'
# 함수 호출
combined_df = combine_csv_from_s3(bucket_name, prefix)
# 결과 출력
print(combined_df)
정의한 함수는 다음과 같이 사용이 가능하다.
다만 내가 사용한 방법은, 객체의 수와 내부 데이터 수가 많지 않아 가능했던 방법이다.
더 많은 객체와 큰 데이터를 불러오기 위해선 멀티프로세싱이나 다른 방법을 강구해야 할 것 같다.
728x90
반응형
'👩💻 Develope > Python' 카테고리의 다른 글
[Python] 주피터 노트북 커널 생성하기 (0) | 2025.03.10 |
---|---|
[Python] Salt (0) | 2025.02.26 |
[Python] 파이썬으로 해시(Hash)와 해시테이블(Hash Table) 구현하기 (0) | 2025.02.19 |
[Pandas] explode (0) | 2025.02.10 |
[Python] Jira API 사용하기 (0) | 2025.01.20 |
728x90
반응형
[boto3][Pandas] s3에서 여러개의 파일을 읽어 하나의 df로 저장하기

데이터를 비교해야하는 업무가 있었는데, s3 버킷에 여러개의 csv 파일이 있었고 해당 파일을 하나의 df로 묶어
비교 대상과 비교해야했다.
나는 boto3
를 이용하여 객체를 읽은 다음 df에 append 하는 방식으로 진행을 했는데 자세히 알아보자.
함수 정의
import pandas as pd
import boto3
from io import StringIO
def combine_csv_from_s3(bucket_name, prefix):
# S3 클라이언트 생성
s3 = boto3.client('s3')
# 지정된 prefix 아래의 모든 객체 목록을 가져옵니다.
response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
# CSV 파일을 저장할 리스트
dfs = []
# 각 객체를 반복하며 CSV 파일을 읽습니다.
for obj in response.get('Contents', []):
key = obj['Key']
if key.endswith('.csv'): # CSV 파일만 처리
# S3에서 객체를 다운로드하고 DataFrame으로 변환
csv_obj = s3.get_object(Bucket=bucket_name, Key=key)
body = csv_obj['Body'].read().decode('utf-8')
df = pd.read_csv(StringIO(body))
dfs.append(df)
# 모든 DataFrame을 하나로 합칩니다.
combined_df = pd.concat(dfs, ignore_index=True)
return combined_df
boto3
를 사용하여 S3에 접근한다.list_objects_v2
메서드를 사용하여 지정된 prefix의 모든 객체를 나열한다.- 각 객체가 CSV 파일인지 확인한 후,
get_object
메서드를 사용하여 파일을 읽고 DataFrame으로 변환한다. - 모든 DataFrame을
pd.concat()
으로 합친다.
# S3 버킷 이름과 파일의 prefix
bucket_name = 'your-bucket-name'
prefix = 'path/to/csv/files/'
# 함수 호출
combined_df = combine_csv_from_s3(bucket_name, prefix)
# 결과 출력
print(combined_df)
정의한 함수는 다음과 같이 사용이 가능하다.
다만 내가 사용한 방법은, 객체의 수와 내부 데이터 수가 많지 않아 가능했던 방법이다.
더 많은 객체와 큰 데이터를 불러오기 위해선 멀티프로세싱이나 다른 방법을 강구해야 할 것 같다.
728x90
반응형
'👩💻 Develope > Python' 카테고리의 다른 글
[Python] 주피터 노트북 커널 생성하기 (0) | 2025.03.10 |
---|---|
[Python] Salt (0) | 2025.02.26 |
[Python] 파이썬으로 해시(Hash)와 해시테이블(Hash Table) 구현하기 (0) | 2025.02.19 |
[Pandas] explode (0) | 2025.02.10 |
[Python] Jira API 사용하기 (0) | 2025.01.20 |