일반인을 위한 파이썬 지침서/파일 입출력
여기에 간단한 파일 입출력의 예가 하나 있다.
# 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'은 파이썬에게 바로 그 지점에서 새로운 라인을 출력하라고 지시한다.
파일 입출력의 개요는 다음과 같다.
- open 함수로 파일 객체를 가져온다.
- 그 파일 객체에 대하여 (어떤 상태로 열렸느냐에 따라) 읽기 또는 쓰기를 한다.
- 그것을 닫는다.
첫째 단계는 파일객체를 획득하는 것이다. 이것을 하는 방법은 open 함수를 사용하는 것이다. 그 형식은 file_object = open(filename,mode)이며 file_object 는 파일 객체를 담을 변수이다, filename 화일이름을 나타내는 문자열이며, mode 는 "r"로 읽기(read)를, "w" 로 쓰기(w) 를 나타낸다. 다음으로 그 파일 객체의 함수는 호출될 수 있다. 두개의 가장 일반적인 함수는 read 와 write 이다. 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 사전에 등록된다.