이 글에서는 예시로 사용할 텍스트 파일의 이름을 bar.txt라고 하겠습니다.
중복 줄 제거의 기본 원리
파이썬에서 텍스트 파일에 포함된 중복된 줄을 제거하려면 파일 처리(file handling) 기능을 활용하면 됩니다. 핵심 아이디어는 간단합니다. 파일을 한 줄씩 읽으면서 아직 등장하지 않은 줄만 집합(set)에 기록하고 출력 파일에 쓰는 것입니다.
주의할 점은 입력 파일(bar.txt)과 출력 파일(foo.txt)이 반드시 파이썬 스크립트와 같은 디렉터리에 있어야 한다는 것입니다. 그렇지 않으면 프로그램이 정상적으로 동작하지 않습니다.
먼저 중복된 줄이 포함된 bar.txt 파일의 내용은 다음과 같습니다.
A cow is an animal.
A cow is an animal.
A buffalo too is an animal.
Lion is the king of jungle.
예제 코드
아래 코드는 bar.txt에서 중복된 줄을 제거한 뒤 그 결과를 foo.txt에 저장합니다.
# bar.txt 파일을 열어 중복된 줄을 제거하고 foo.txt에 저장하는 프로그램
lines_seen = set() # 이미 확인한(등장한) 줄을 저장하는 집합
outfile = open('foo.txt', 'w')
infile = open('bar.txt', 'r')
print("bar.txt 파일의 내용은 다음과 같습니다.")
for line in infile:
print(line)
if line not in lines_seen: # 중복되지 않은 경우에만 기록
outfile.write(line)
lines_seen.add(line)
outfile.close()
print("foo.txt 파일의 내용은 다음과 같습니다.")
for line in open('foo.txt', 'r'):
print(line)
실행 결과
프로그램 실행 후 foo.txt 파일의 내용은 다음과 같습니다.
A cow is an animal.
A buffalo too is an animal.
Lion is the king of jungle.
이 방식은 파일을 처음부터 끝까지 순서대로 읽으며 중복 여부를 검사하므로, 원본 파일의 줄 순서가 그대로 유지된다는 장점이 있습니다.
with 문을 활용한 더 안전한 작성법
파이썬에서는 with 문을 사용하면 파일을 자동으로 닫아주기 때문에 리소스 누수를 걱정할 필요가 없습니다. 실무에서는 아래처럼 작성하는 것이 권장됩니다.
seen = set()
with open('bar.txt', 'r') as infile, open('foo.txt', 'w') as outfile:
for line in infile:
if line not in seen:
outfile.write(line)
seen.add(line)
이렇게 하면 코드가 더 간결해지고, 예외가 발생해도 파일이 확실하게 닫히므로 안전하게 동작합니다.