안전 결제자세히
- 패키지 범위 내 수정은 무료입니다.
- 납품 후 3일 이내에 응답하지 않으면 작업이 자동으로 승인됩니다.
결제 시 금액이 예치되며, 작업을 승인해야만 지급됩니다.

결과물 예시
매장 9곳의 월별 매출 파일을 Excel 보고서 하나로 합치기
실행 방법
python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO 폴더: sales/2026-10, 파일 9개 발견
2026-11-02 09:14:03 INFO shop-01.csv: 1,284행
2026-11-02 09:14:04 INFO shop-02.xlsx: 967행
2026-11-02 09:14:04 WARN shop-07.csv: 가격 없는 3행 건너뜀 (88, 412, 913번 줄)
2026-11-02 09:14:05 INFO 완료: 10,412행 -> report-2026-10.xlsx ("매출", "합계" 시트)
코드가 아닌 설정으로
매장별 열 이름은 settings.ini에 있어서, 매장이 새로 생기거나 열 이름이 바뀌면 그곳에 한 줄만 고치면 됩니다.
[columns]
date = 날짜, 판매일, 일자
product = 상품, 품목, 상품명
quantity = 수량, 개수, 판매 수량
price = 가격, 단가
코드 일부
def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
"""매장 파일 하나를 읽고 열 이름을 보고서 기준으로 바꿉니다."""
table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
renamed = {}
for name, variants in columns.items():
found = next((c for c in table.columns if c.strip() in variants), None)
if found is None:
raise ReportError(f"{path.name}: '{name}'에 해당하는 열이 없습니다 (찾은 이름: {', '.join(variants)})")
renamed[found] = name
table = table.rename(columns=renamed)[list(columns)]
table["shop"] = path.stem
return table
파일: merge_sales.py(310줄), settings.ini, requirements.txt, 그리고 Python 설치, 스크립트 실행, 로그 메시지별 의미를 설명한 README가 들어 있는 ZIP 압축 파일. 고객이 자신의 컴퓨터에서 직접 실행합니다.
고객: 문구점 9곳을 운영하는 작은 체인. 매장마다 한 달 매출을 CSV나 Excel 파일로 보내는데, 열 이름이 조금씩 다릅니다. 과제: 폴더 안의 모든 파일을 읽고 열을 하나의 형식으로 맞춘 뒤, 전체 매출과 매장별 합계 시트가 담긴 Excel 보고서 하나로 저장하는 스크립트.
고객과 모든 정보는 가상입니다.
서비스 소개
쇼핑몰, CRM, 이벤트 신청에서 내보낸 연락처는 메일 발송 서비스가 가져오려는 형식과 거의 맞지 않습니다. 열 이름이 다르고, 성과 이름이 한 칸에 있고, 태그가 엉뚱한 곳에 있고, 수신 거부한 사람이 아직 목록에 남아 있습니다. 이 Python 스크립트는 내보낸 파일을 읽어 서비스의 가져오기 구조에 맞는 깔끔한 CSV 하나로 씁니다. 필요하면 이름을 나누고, 필드와 태그를 매핑하고, 형식이 잘못된 이메일과 중복은 빼며, 스탠다드부터는 동의 표시가 있는 사람만 남기고 수신 거부한 사람은 제거하고, 빠진 행은 확인하실 수 있도록 별도 파일로 남깁니다. 연락받기에 동의한 고객님 자신의 연락처를 위한 것이며, 구매하거나 수집한 목록용이 아닙니다. 스크립트는 고객님의 컴퓨터에서 실행되며 서비스에 접속하지 않습니다. 파일 가져오기는 직접 하십니다.
포함 사항
- 받으시는 결과물Python 스크립트, 단계별 안내가 담긴 README, 스탠다드부터는 필드와 태그 매핑이 담긴 설정 파일이 들어 있는 ZIP 압축 파일. 코드는 주문 페이지에서도 볼 수 있습니다.
- 메일 발송 서비스의 구조가져오기 템플릿이나 샘플 파일 기준
- 수신 동의 존중스탠다드부터, 동의한 사람만 남기고 수신 거부자는 제외
- 중복과 오타 제거형식이 잘못된 주소와 중복 제외
- 제외한 행 보관무엇이 왜 빠졌는지 보여 주는 별도 파일
- 읽기 쉬운 코드주석이 있어 나중에 필드 추가가 쉬움
진행 방식
- 1샘플내보낸 파일별 임의의 행과 서비스의 가져오기 형식을 보내 주세요
- 2코드스크립트와 실행 안내서를 작성합니다
- 3시험 실행실행해 본 뒤 제외된 행을 살펴보고 작은 테스트 목록을 가져와 보세요
- 4수정패키지 범위 안에서 수정을 요청하고 오류 메시지가 있으면 보내 주세요
준비해 주실 내용
내보낸 파일별 머리글과 10~20행(이름과 이메일은 임의의 값으로, 구조는 그대로), 어떤 열이 수신 동의를, 어떤 열이 수신 거부를 나타내는지, 사용하시는 메일 발송 서비스와 그 가져오기 템플릿이나 가져오기 도움말 페이지 링크, 태그나 세그먼트를 어떻게 설정할지. 연락처를 어떻게 모으셨는지(쇼핑몰, 신청 양식, 이벤트). 실제 목록은 절대 보내지 마세요.
다음 내용을 여쭤봅니다:
- 연락처는 어디서 오나요?
- 어떤 메일 발송 서비스로 가져오시나요?
- 수신 동의는 어떻게 기록되어 있나요?
- 태그나 세그먼트가 필요하신가요?
패키지 비교
안전 결제
주문할 때 결제하지만, 대금은 승인된 작업에 대해서만 지급됩니다.
- 고정 가격결제 후에는 패키지 가격이 변경되지 않습니다.
- 금액 예치결제 시 금액은 예치만 됩니다. 작업을 승인하면 서비스에 지급됩니다.
- 납품 전 검수모든 결과물은 전달되기 전에 품질 검수를 거치며, 승인하기 전에 주문 페이지에서 확인할 수 있습니다.
- 무료 수정패키지에서 허용하는 횟수만큼 요청 사항 범위 내에서 수정을 요청할 수 있습니다.
- 3일 후 자동 승인납품 후 3일 이내에 작업을 승인하거나 수정을 요청하지 않으면 자동으로 승인됩니다. 납품 후 주문 채팅에 메시지를 남기면 주문은 대기 상태가 됩니다. 저희가 답변한 뒤 3일을 다시 시작할 수 있으며, 이 경우 채팅으로 알려 드립니다.
- 재작업 또는 전액 환불결과물이 요청 사항과 맞지 않고 수정으로도 해결되지 않았거나, 작업이 작업 기간의 두 배를 넘겨 지연되면 주문 채팅에 알려 주세요. 작업을 다시 하거나 결제 금액을 전액 환불해 드립니다.
질문과 답변
구매한 목록에도 쓸 수 있나요?
아니요. 이메일 수신에 동의한 고객님 자신의 연락처를 위한 것입니다. 구매하거나 수집한 목록은 메일 발송 서비스의 규정과 많은 나라의 법을 위반합니다.
연락처를 서비스에 업로드하나요?
아니요. 파일만 만듭니다. 가져오기는 메일 발송 서비스 계정에서 직접 하시며, 그곳에서 연락처가 동의했는지 확인하라는 요청도 받게 됩니다.
이메일 주소가 실제로 있는지 확인하나요?
각 주소가 올바르게 적혔는지 확인하고 흔한 도메인 오타를 표시합니다. 메일함이 실제로 있는지는 메일 서비스만 알 수 있으며, 반송은 발송 후 메일 발송 서비스가 알려 줍니다.
제 연락처 목록은 안전한가요?
목록은 고객님의 컴퓨터에 그대로 있습니다. 스크립트는 직접 실행하시고, 저희는 보내 주신 임의의 행만 봅니다.
답을 찾지 못하셨나요?