next up previous contents
Next: 불완전함을 다루기 Up: 일반인을 위한 파이썬 지침서 Previous: 문자열의 복수   목 차

파일 입출력

여기에 간단한 파일 입출력의 예가 하나 있다:
#Write a file
out_file = open("test.txt","w")
out_file.write("This Text is going to out file\nLook at it and see\n")
out_file.close()

#Read a file
in_file = open("test.txt","r")
text = in_file.read()
in_file.close()

print text,
test.txt 파일의 내용과 출력은 다음과 같다:
This Text is going to out file
Look at it and see
여러분이 프로그램을 실행한 디렉토리에 그 프로그램이 test.txt 라는 불리우는 파일을 작성하고 있음을 주목하라. 문자열 속의 '\n'은 파이썬에게 바로 그 지점에서 새로운 라인을 출력하라고 지시한다.

파일 입출력의 개요는 다음과 같다.:

  1. open 함수로 파일 객체를 가져온다.
  2. 그 파일 객체에 대하여 (어떤 상태로 열렸느냐에 따라) 읽기 또는 쓰기를 한다.
  3. 그것을 닫는다.

첫째 단계는 파일객체를 획득하는 것이다. 이것을 하는 방법은 open 함수를 사용하는 것이다. 그 형식은 file_object = open(filename,mode)이며 file_object 는 파일 객체를 담을 변수이다, filename 화일이름을 나타내는 문자열이며, mode"r"로 읽기(read)를, "w" 로 쓰기(w) 를 나타낸다. 다음으로 그 파일 객체의 함수는 호출될 수 있다. 두개의 가장 일반적인 함수는 readwrite 이다. write 함수는 문자열을 파일의 끝에다가 추가한다. read 함수는 파일에서 다음의 것을 읽는다 그리고 그것을 문자열로 반환한다. 만일 아무런 인수도 주어지지 않는다면 그것은 (이 예제에서 실행된 것 같이) 전체 화일을 반환할 것이다.

이제 여기에 우리가 이전에 만들었던 전화 번호 프로그램의 새로운 버전이 있다:

import string

def print_numbers(numbers):
    print "Telephone Numbers:"
    for x in numbers.keys():
        print "Name: ",x," \tNumber: ",numbers[x]
    print

def add_number(numbers,name,number):
    numbers[name] = number

def lookup_number(numbers,name):
    if numbers.has_key(name):
        return "The number is "+numbers[name]
    else:
        return name+" was not found"

def remove_number(numbers,name):
    if numbers.has_key(name):
        del numbers[name]
    else:
        print name," was not found"


def load_numbers(numbers,filename):
    in_file = open(filename,"r")
    while 1:
        in_line = in_file.readline()
        if in_line == "":
            break
        in_line = in_line[:-1]
        [name,number] = string.split(in_line,",")
        numbers[name] = number
    in_file.close()

def save_numbers(numbers,filename):
    out_file = open(filename,"w")
    for x in numbers.keys():
        out_file.write(x+","+numbers[x]+"\n")
    out_file.close()


def print_menu():
    print '1. Print Phone Numbers'
    print '2. Add a Phone Number'
    print '3. Remove a Phone Number'
    print '4. Lookup a Phone Number'
    print '5. Load numbers'
    print '6. Save numbers'
    print '7. Quit'
    print
phone_list = {}
menu_choice = 0
print_menu()
while menu_choice != 7:
    menu_choice = input("Type in a number (1-7):")
    if menu_choice == 1:
        print_numbers(phone_list)
    elif menu_choice == 2:
        print "Add Name and Number"
        name = raw_input("Name:")
        phone = raw_input("Number:")
        add_number(phone_list,name,phone)
    elif menu_choice == 3:
        print "Remove Name and Number"
        name = raw_input("Name:")
        remove_number(phone_list,name)
    elif menu_choice == 4:
        print "Lookup Number"
	name = raw_input("Name:")
        print lookup_number(phone_list,name)
    elif menu_choice == 5:
        filename = raw_input("Filename to load:")
        load_numbers(phone_list,filename)
    elif menu_choice == 6:
        filename = raw_input("Filename to save:")
        save_numbers(phone_list,filename)
    elif menu_choice == 7:
        pass
    else:
        print_menu()
print "Goodbye"
이제 그것은 파일을 저장하고 로드하는 것을 포함한다. 여기에 내가 그것을 두번 실행한 출력이 있다:
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit

Type in a number (1-7):2
Add Name and Number
Name:Jill
Number:1234
Type in a number (1-7):2
Add Name and Number
Name:Fred
Number:4321
Type in a number (1-7):1
Telephone Numbers:
Name:  Jill     Number:  1234
Name:  Fred     Number:  4321

Type in a number (1-7):6
Filename to save:numbers.txt
Type in a number (1-7):7
Goodbye
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit

Type in a number (1-7):5
Filename to load:numbers.txt
Type in a number (1-7):1
Telephone Numbers:
Name:  Jill     Number:  1234
Name:  Fred     Number:  4321

Type in a number (1-7):7
Goodbye

이 프로그램의 새로운 부분은 다음과 같다:

def load_numbers(numbers,filename):
    in_file = open(filename,"r")
    while 1:
        in_line = in_file.readline()
        if len(in_line) == 0:
            break
        in_line = in_line[:-1]
        [name,number] = string.split(in_line,",")
        numbers[name] = number
    in_file.close()
def save_numbers(numbers,filename):
    out_file = open(filename,"w")
    for x in numbers.keys():
        out_file.write(x+","+numbers[x]+"\n")
    out_file.close()

먼저 우리는 그 프로그램에서 저장하는 부분을 살펴 볼 것이다. 먼저 그것은 open(filename,"w") 명령어로 파일 객체를 생성한다. 다음으로 그것은 전화번호들 각각을 위하여 'out_file.write(x+","+numbers[x]+"\n")' 명령어로 하나의 라인을 생성해 나간다. 이것은 이름, 컴마, 전화번호를 포함하는 하나의 라인을 출력하고 다음에 새로운 라인이 출력된다.

읽어들이는 부분은 약간은 더 복잡하다. 그것은 파일 객체를 획득하는 것으로 시작한다. 그리고 그것은 break서술문을 만날 때까지 회돌이를 유지하기 위하여 'while 1:'을 사용한다. 다음으로 in_line = in_file.readline()라는 코드로 한 라인을 읽어 들인다. getline함수는 파일의 끝에 다다르면 빈 문자열(len(string) == 0)을 반환할 것이다. if 서술문은 이것을 점검해서 만일 그런 일이 일어난다면 while회돌이를 빠져나온다. 물론 readline 함수가 새로운라인 문자를 그 라인의 끝에서 반환하지 않았다면 빈 문자열이 빈 라인인지 혹은 파일의 마지막인지 말해줄 방법이 없으므로 새로운라인 문자는 getline 이 반환해준 곳에 남는다.

그러므로 우리는 그 새로운라인 문자를 제거해야 한다. in_line = in_line[:-1] 라인은 우리를 위하여 마지막 문자를 제거 함으로써 이일을 해준다. 다음의 [name,number] = string.split(in_line,",") 라인은 컴마위치에서 이름과 전화번호로 그 라인을 분할한다. 그리고나서 이것은 numbers 사전에 등록된다.


next up previous contents
Next: 불완전함을 다루기 Up: 일반인을 위한 파이썬 지침서 Previous: 문자열의 복수   목 차
Josh Cogliati jjc@iname.com