Python 기초

텍스트 입출력 기법

데이터 추가하기

이미 존재하는 파일에 데이터를 추가할 때는 "a" 파일 모드를 사용합니다. "a"는 "append"의 약자입니다.

outfile = open("phones.txt", "a")

outfile.write("최무선 010-1111-2222")
outfile.write("정중부 010-2222-3333")

outfile.close()

 

줄바꿈 기호 삭제하기

파일에서 텍스트를 읽어서 출력하다보면 파일에 들어 있는 줄바꿈 기호 때문에 의도하지 않게 빈 줄이 추가되는 일이 발생합니다.

예를 들어서 다음과 같은 파일을 봅시다.

  • 파일 이름 : myLove.txt
An empty street
An empty house
A hole inside my heart
I'm all alone
The rooms are getting smaller

 

위의 파일을 읽어서 화면에 출력하는 프로그램을 작성해봅시다.

infile = open("myLove.txt", "r")

for line in infile:
    print(line)

infile.close()

 

<실행 결과>

An empty street

An empty house

A hole inside my heart

I'm all alone

The rooms are getting smaller

 

출력 결과를 보면 문장의 사이에 빈 줄이 하나씩 들어 있음을 알 수 있습니다. 왜 이런 결과가 출력되었을까요?

텍스트 파일에서 첫 번째 줄은 다음과 같이 저장되어 있습니다.

 

 

여기서 문제가 되는 것은 줄의 끝에 있는 줄바꿈 기호인 '\n' 입니다. 이것 때문에 빈 줄이 출력된 것입니다.

따라서 파일에서 읽을 때 줄의 끝에 있는 줄바꿈 기호를 삭제하고 읽을 수 있으면 좋을 것입니다. 파이썬에서는 rstrip() 메소드가 이런 작업을 합니다.

line = line.rstrip()

 

위의 코드에 위의 문장을 추가하면 빈 줄이 사라지게 됩니다. rstrip()은 줄바꿈 문자 뿐만 아니라 공백문자도 제거합니다. strip()은 줄의 첫 부분과 끝에서 공백 문자를 삭제합니다.

 

파일에서 단어 읽기

텍스트 파일에서 단어를 읽어야 한다면 어떻게 해야 할까요? 예를 들어서 앞에 나왔던 노래 가사에서 단어를 분리하여 리스트로 만들고 싶다고 합시다.

이때 사용할 수 있는 것이 split() 메소드입니다. 문자열 객체의 split() 메소드는 공백문자를 이용하여 문자열에서 단어들을 분리합니다.

infile = open("myLove.txt", "r")

for line in infile:
    line = line.rstrip()
    wordList = line.split()

    for word in wordList:
        print(word)

infile.close()

 

<실행 결과>

An
empty
street
An
empty
house
A
hole
inside
my
heart
I'm
all
alone
The
rooms
are
getting
smaller

 

문자열에서 단어를 분리할 때 공백이 아닌 다른 분리자를 사용하고 싶으면 split() 메소드의 인수로 분리자로 사용되는 문자를 주면 됩니다.

예를 들어서 ":"을 사용하여 분리하고 싶으면 아래와 같이 합니다.

line = "Bad: news: travels: fast."
word_list = line.split(":")
print(word_list)

 

<실행 결과>

['Bad', ' news', ' travels', ' fast.']

 

숫자 데이터

텍스트 파일에는 텍스트 형태의 데이터만 저장할 수 있습니다. 따라서 만약 숫자 데이터를 저장해야 한다면 숫자를 문자열로 변환한 후에 저장하여야 합니다.

숫자를 문자열로 저장하려면 숫자에 str() 함수를 적용합니다.

outfile = open("number.txt", "w")

for i in range(10):
    outfile.write(str(i) + " ")

outfile.close()

 

<실행 결과>

  • 파일 number.txt 에 아래와 같이 기록됩니다.
0 1 2 3 4 5 6 7 8 9 

 

위의 코드에서 0부터 9까지의 정수는 str() 함수에 의하여 문자열로 변환된 후에 파일에 기록됩니다.

 

파일 대화 상자

우리가 윈도우에서 파일을 열 때는 tkinter의 파일 열기 대화 상자를 이용하면 파일을 쉽게 찾을 수 있습니다.

from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename

readFile = askopenfilename()

if readFile != None:
    infile = open(readFile, "r")

for line in infile.readlines():
    line = line.strip()
    print(line)

infile.close()

 

<실행 결과>

  • 파일 myLove.txt 를 선택했을 때
An empty street
An empty house
A hole inside my heart
I'm all alone
The rooms are getting smaller

 

도전 과제

1. 텍스트 파일을 열어서 파일 안의 스페이스 문자의 개수와 탭의 개수를 세는 프로그램을 작성해 봅시다.

 

<실행 결과>

파일 이름을 입력하세요 : myLove.txt
스페이스 수 = 14, 탭의 수 = 0

 


2. 텍스트 파일을 열어서 각 줄의 앞에 번호를 매겨서 다시 파일에 쓰는 프로그램을 작성해봅시다.

 

<입력 파일> - myLove.txt

An empty street
An empty house
A hole inside my heart
I'm all alone
The rooms are getting smaller

 

<실행 결과>

읽을 파일 이름을 입력하세요 : myLove.txt
결과를 쓸 파일 이름을 입력하세요 : output.txt

 

<파일 출력 결과>

1: An empty street
2: An empty house
3: A hole inside my heart
4: I'm all alone
5: The rooms are getting smaller

 


3. 파일 안의 각 문자들이 몇 번이나 나타나는지를 세는 프로그램을 작성해봅시다.

 

<입력 파일> - myLove.txt

An empty street
An empty house
A hole inside my heart
I'm all alone
The rooms are getting smaller

 

<실행 결과>

파일명을 입력하세요 : myLove.txt
{'A': 3, 'n': 5, ' ': 14, 'e': 13, 'm': 6, 'p': 2, 't': 7, 'y': 3, 's': 5, 'r': 5, 'h': 4, 'o': 5, 'u': 1, 'l': 6, 'i': 3, 'd': 1, 'a': 5, 'I': 1, "'": 1, 'T': 1, 'g': 2}

 


4. CSV(Comma Separated Values) 형식은 엑셀과 같은 스프레드시트나 데이터베이스에서 가장 널리 사용되는 입출력 형식입니다.

파이썬은 CSV 형식을 읽기 위해서 csv 라고 하는 모듈을 제공합니다. 이 모듈을 이용하면 CSV 파일을 쉽게 읽을 수 있습니다. 우리는 연습 삼아서 CSV 형식의 파일을 읽는 코드를 작성해봅시다.

 

<입력 파일> - data.csv

1/24/1997,11,3,red
11/27/1998,5,2,green
3/6/1997,9,1,blue

 

<출력 결과>

csv 파일 이름을 입력하세요 : data.csv
1/24/1997,11,3,red
         1/24/1997
         11
         3
         red
11/27/1998,5,2,green
         11/27/1998
         5
         2
         green
3/6/1997,9,1,blue
         3/6/1997
         9
         1
         blue

 


5. 로마의 유명한 정치가였던 쥴리어스 시저(Julius Caesar, 100-44 B.C.)는 친지들에게 비밀리에 편지를 보내고자할 때 다른 사람들이 알아보지 못하도록 문자들을 다른 문자들도 치환하였습니다.

시저 암호의 규칙을 표로 그려 보면 아래와 같습니다.

 

평문 a b c d e f g h i j k l m n o p q r s t u v w x y z
암호문 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

 

점술회 회장 봉민이도 시저 암호를 통해 회원들에게 약속 장소를 알리려고 할 때 봉민이가 보낸 평문을 암호화 하는 프로그램과 복호화 하는 프로그램을 만들어봅시다.

 

<실행 결과>

평문 : the language of truth is simple.
암호문 : wkh odqjxdjh ri wuxwk lv vlpsoh.
복호문 : the language of truth is simple.