파이썬 문자열 숫자 변환 오류 해결 방법과 안전한 형변환 단계
파이썬에서 문자열을 숫자로 변환할 때 자주 마주치는 ValueError의 원인을 짚고, 콤마·공백·소수점이 포함된 데이터를 안전하게 int와 float로 변환하는 실무 처리 절차를 정리합니다.
업무에서 만나는 상황: 엑셀 수치와 입력값이 계산되지 않을 때
사내 업무 자동화 스크립트를 작성하거나 엑셀, CSV 파일을 파이썬으로 가공할 때 숫자로 보이는 데이터가 덧셈이나 곱셈 연산에서 엉뚱하게 동작하는 현상을 자주 겪게 됩니다. 가령 수량 10과 단가 5000을 곱해 총액을 구하려 했는데, 곱셈 결과 대신 '10'이라는 글자가 5,000번 반복 출력되거나 TypeError가 발생하는 식입니다.
이러한 현상이 발생하는 이유는 파일에서 읽어온 값이나 input() 함수로 전달받은 사용자 입력값의 기본 자료형이 수치형(int, float)이 아닌 문자열(str)이기 때문입니다. 이때 초급 개발자가 단순히 int() 함수로 감싸서 해결하려 시도하면, 'ValueError: invalid literal for int() with base 10'과 같은 실행 오류가 발생하며 프로그램 전체가 중단되기도 합니다. 실무 데이터를 원활하게 다루려면 입력받은 문자열의 형태를 정확히 파악하고 올바른 변환 단계를 거쳐야 합니다.

핵심 개념: 파이썬 자료형과 ValueError가 발생하는 근본 원인
파이썬은 변수의 자료형을 엄격하게 구분하는 언어입니다. 화면에 '100'이라고 표시되더라도 따옴표로 묶인 데이터는 문자(str)로 인식되며, 사칙연산을 수행하기 위해서는 정수(int)나 실수(float)로 명시적 형변환(Type Casting)을 진행해야 합니다.
int()는 기본적으로 10진수 정수 표현을 읽으며, 앞뒤의 공백·탭·줄바꿈과 부호를 허용합니다. 예를 들어 int(' 100 ')은 100을 반환하고, 진법을 지정하면 int('FF', 16)처럼 다른 진법도 처리할 수 있습니다. 반면 천 단위 쉼표가 있는 '1,000', 소수점이 있는 '12.5', 빈 문자열은 기본 int() 호출에서 ValueError를 일으킵니다. 숫자 중간의 공백이나 단위 문자도 별도로 확인해야 합니다. 따라서 모든 공백을 오류 원인으로 보지 말고, 실제 입력 형식과 변환 함수가 허용하는 형식을 구분해야 합니다.

작은 예시: 콤마 제거, 소수점 처리, 예외 처리 기본 패턴
실무에서 가장 흔하게 발생하는 세 가지 변환 실패 패턴을 해결하는 방법은 간단한 내장 메서드와 구문을 조합하는 것입니다. 첫째, 쉼표가 포함된 금액 문자열은 replace() 메서드로 쉼표를 먼저 제거한 뒤 int()로 변환합니다. 예를 들어 price_str = '25,000' 형태라면 price = int(price_str.replace(',', '')) 형태로 작성하면 안전하게 25000 정수를 얻을 수 있습니다.
둘째, 소수점이 포함된 문자열 '3.14'를 정수로 바꾸고자 할 때 바로 int('3.14')를 호출하면 오류가 발생합니다. 이 경우 소수를 유지하려면 float('3.14')를 사용할 수 있습니다. int(float('3.14'))는 반올림이 아니라 소수 부분을 버려 3이 되므로, 정수로 바꿀 때는 허용할 변환 규칙을 먼저 정해야 합니다. 셋째, 결측치나 빈 문자열, 혹은 문자가 섞여 들어올 가능성이 있는 외부 데이터는 try-except ValueError 블록으로 변환 실패를 처리하고, 해당 행을 별도 기록하거나 누락값으로 구분할 수 있습니다. 잘못된 입력을 자동으로 0으로 바꾸면 실제 값 0과 구분되지 않으므로, 기본값 사용 여부는 업무 규칙으로 정해야 합니다.

적용 순서: 실무 데이터 정제부터 안전한 수치 계산까지의 4단계
외부에서 유입되는 문자열 데이터를 수치형으로 안전하게 변환하려면 표준화된 파이프라인을 구축하는 것이 좋습니다. 첫 번째 단계는 입력값의 양쪽 공백과 개행 문자를 strip() 메서드로 제거하는 '공백 정제'입니다. int()와 float()는 앞뒤의 일반적인 공백을 이미 허용하므로, strip()은 변환에 항상 필요한 과정은 아닙니다. 다만 빈 입력을 구분하고 후속 문자열 비교 기준을 맞추는 데 유용합니다. 숫자 중간의 공백과 다른 특수문자는 따로 살펴봐야 합니다.
두 번째 단계는 통화 기호, 천 단위 쉼표, 원화 기호(₩) 등 불필요한 특수문자를 제거하는 '서식 문자 정제'입니다. 세 번째 단계는 소수점 유무에 따라 float() 또는 int()를 선택하고, try-except 블록을 활용해 변환 불가능한 비정상 데이터가 유입되었을 때 로그를 남기거나 예외 처리를 수행하는 '안전 변환' 단계입니다. 마지막 네 번째 단계에서는 변환된 수치 변수의 타입을 type() 함수로 검증한 뒤 비즈니스 사칙연산을 수행하도록 흐름을 완성합니다.

이해 확인: 내가 작성한 형변환 코드가 안전한지 점검하기
작성한 코드가 실무 환경에서 예기치 않은 입력값에도 견딜 수 있는지 확인하려면 몇 가지 가상의 입력 조건을 대입해 테스트해야 합니다. 만약 빈 문자열('')이 들어오거나, 'N/A', '무료'와 같은 한글 텍스트가 섞여 들어왔을 때 프로그램이 오류를 뿜으며 강제 종료되는지, 아니면 예외를 적절히 우회하는지 확인해 보시기 바랍니다.
또한 '100.0'과 같은 문자열을 정수 컬럼에 넣어야 할 때 float()를 거치지 않고 곧바로 int()를 호출해 ValueError를 발생시키고 있지는 않은지도 체크 포인트입니다. 입력 데이터가 정제되지 않은 문자열 형태일 때는 항상 '정제 -> 예외 처리 -> 변환'의 순서를 지키는 것이 파이썬 프로그래밍 기본기를 다지는 가장 빠른 지름길입니다.