파일안에는바이트들이순차적으로저장되어있고맨끝에는 EOF(end-of-file) 마커가있다. 모든파일은입출력동작이발생하는위치를나타내는위치표시자 (position indicator) 를가지고있다.
텍스트파일 (text file) 이진파일 (binary file)
infile = open("phones.txt", "r") s = infile.read(10) print(s); infile.close() 홍길동 010-12
infile = open("phones.txt", "r") s = infile.readline() print(s); s = infile.readline() print(s); s = infile.readline() print(s); infile.close() 홍길동 010-1234-5678 김철수 010-1234-5679 김영희 010-1234-5680
infile = open("phones.txt", "r") line = infile.readline() while line!= "": print(line); line = infile.readline() infile.close() 홍길동 010-1234-5678 김철수 010-1234-5679 김영희 010-1234-5680
infile = open("phones.txt", "r") for line in infile: line = line.rstrip() print(line) infile.close() 홍길동 010-1234-5678 김철수 010-1234-5679 김영희 010-1234-5680
import os.path outfile = open("phones.txt", "w") if os.path.isfile("phones.txt"): print(" 동일한이름의파일이이미존재합니다. ") else : outfile.write(" 홍길동 010-1234-5678") outfile.write(" 김철수 010-1234-5679") outfile.write(" 김영희 010-1234-5680") outfile.close()
# 입력파일이름과출력파일이름을받는다. infilename = input(" 입력파일이름 : "); outfilename = input(" 출력파일이름 : "); # 입력과출력을위한파일을연다. infile = open(infilename, "r") outfile = open(outfilename, "w") # 합계와횟수를위한변수를정의한다. sum = 0 count = 0 # 입력파일에서한줄을읽어서합계를계산한다. for line in infile: dailysale = int(line) sum = sum + dailysale count = count + 1 # 총매출과일평균매출을출력파일에기록한다. outfile.write(" 총매출 = "+ str(sum)+"\n") outfile.write(" 평균일매출 = "+ str(sum/count )) infile.close() outfile.close()
데이터추가하기 outfile = open("phones.txt", "a") outfile.write(" 최무선 010-1111-2222") outfile.write(" 정중부 010-2222-3333") outfile.close()
줄바꿈기호삭제하기 infile = open("proverbs.txt", "r") for line in infile: line = line.rstrip() print(line); infile.close()
파일에서단어읽기
infile = open("proverbs.txt", "r") for line in infile: line = line.rstrip() word_list = line.split() for word in word_list: print(word); infile.close() All's well that ends well.... flock together.
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()
텍스트파일을열어서파일안의스페이스문자의개수와탭의개수를세는프로그램을작성하여보자. 파일이름을입력하시오 : proverbs.txt 스페이스수 = 20, 탬의수 = 0
def parse_file(path): infile = open(path) spaces = 0 tabs = 0 for line in infile: spaces += line.count(' ') tabs += line.count('\t') infile.close() return spaces, tabs filename = input(" 파일이름을입력하시오 : "); spaces, tabs = parse_file(filename) print(" 스페이스수 = %d, 탬의수 = %d" % (spaces, tabs))
텍스트파일을열어서각줄의앞에번호를매겨서다시파일에쓰는프로그램을작성해보자. 1: All's well that ends well. 2: Bad news travels fast. 3: Well begun is half done. 4: Birds of a feather flock together.
infile = open("proverbs.txt") outfile = open("output.txt","w") i = 1 for line in infile: outfile.write(str(i) + ": " + line) i = i + 1 infile.close() outfile.close()
파일안의각문자들이몇번이나나타나는지를세는프로그램을작성하자. {' ': 16, 'e': 12, 'o': 4, 'a': 7, 'u': 1, 'n': 4, 'k': 1, 'A': 1, 'r': 4, 'g': 2, 's': 7, 'b': 1, 'd': 4, 'v': 1, 'f': 5, 'w': 3, 'B': 2, 'h': 4, 'i': 2, 't': 7, 'l': 11, 'W': 1, '.': 4, "'": 1, 'c': 1}
filename = input(" 파일명을입력하세요 : ").strip() infile = open(filename, "r") # 파일을연다. freqs = {} # 파일의각줄에대하여문자를추출한다. 각문자를사전에추가한다. for line in infile: for char in line.strip(): if char in freqs: freqs[char] += 1 else: freqs[char] = 1 print(freqs) infile.close()
CSV(Comma Separated Values) 형식은엑셀과같은스프레드쉬트나데이터베이스에서가장널리사용되는입출력형식이다. 파이썬은 CSV 형식을읽기위해서 csv 라고하는모듈을제공한다. 이모듈을이용하면 CSV 파일을쉽게읽을수있다. 우리는연습삼아서 CSV 형식의파일을읽는코드를작성하여보자. 1/2/2014,5,8,red 1/2/2014 5 8 red 1/3/2014,5,2,green 1/3/2014 5 2 green 1/4/2014,9,1,blue 1/4/2014 9 1 blue
# 파일을연다. f = open("c:\test.csv", "r") # 파일안의각줄을처리한다. for line in f.readlines(): # 공백문자를없앤다. line = line.strip() # 줄을출력한다. print(line) # 줄을쉼표로분리한다. parts = line.split(",") # 각줄의필드를출력한다. for part in parts: print(" ", part)
예를들어평문 come to me 은 FRPH WR PH 으로바뀐다. 시저암호방식을이용하여서파일을암호화하고복호화하는프로그램을작성하라. 원문 : the language of truth is simple. 암호문 : wkh odqjxdjh ri wuxwk lv vlpsoh. 복호문 : the language of truth is simple.
key = 'abcdefghijklmnopqrstuvwxyz' # 평문을받아서암호화하고암호문을반환한다. def encrypt(n, plaintext): result = '' for l in plaintext.lower(): try: i = (key.index(l) + n) % 26 result += key[i] except ValueError: result += l return result.lower()
# 암호문을받아서복호화하고평문을반환한다. def decrypt(n, ciphertext): result = '' for l in ciphertext: try: i = (key.index(l) - n) % 26 result += key[i] except ValueError: result += l return result n = 3 text = 'The language of truth is simple.' encrypted = encrypt(n, text) decrypted = decrypt(n, encrypted) print (' 평문 : ', text) print (' 암호문 : ', encrypted) print (' 복호문 : ', decrypted)
이진파일 (binary file) 은데이터가직접저장되어있는파일이다.
예를들어평문 come to me 은 FRPH WR PH 으로바뀐다. 시저암호방식을이용하여서파일을암호화하고복호화하는프로그램을작성하라. 원본파일이름을입력하시오 : 123.png 복사파일이름을입력하시오 : kkk.png 123.png 를 kkk.png 로복사하였습니다.
filename1 = input(" 원본파일이름을입력하시오 : "); filename2 = input(" 복사파일이름을입력하시오 : "); infile = open(filename1, "rb") outfile = open(filename2, "wb") # 입력파일에서 1024 바이트씩읽어서출력파일에쓴다. while True: copy_buffer = infile.read(1024) if not copy_buffer: break outfile.write(copy_buffer) infile.close() outfile.close() print(filename1+" 를 " +filename2+" 로복사하였습니다. ")
파일포인터를이동시켜서랜덤하게읽는다.
위치표시자의이동
infile = open("test.txt", "r+") str = infile.read(10); print(" 읽은문자열 : ", str) position = infile.tell(); print(" 현재위치 : ", position) position = infile.seek(0, 0); str = infile.read(10); print(" 다시읽은문자열 : ", str) infile.close() 읽은문자열 : All's well 현재위치 : 10 다시읽은문자열 : All's wel
pickle 모듈의 dump() 와 load() 메소드를사용하면객체를쓰고읽을수있다.
import pickle mymovie = { "Superman vs Batman ": 9.8, "Ironman": "9.6" } # 딕셔너리를피클파일에저장 pickle.dump( mymovie, open( "save.p", "wb" ) ) # 피클파일에딕션너리를로딩 mymovie = pickle.load( open( "save.p", "rb" ) ) print(mymovie) {'Superman vs Batman ': 9.8, 'Ironman': '9.6'}
오류가발생할수있다! >>> (x, y)=(2, 0) >>> z=x/y Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> z=x/y ZeroDivisionError: division by zero >>>
오류가발생했을때오류를사용자에게알려주고모든데이터를저장하게한후에사용자가우아하게 (gracefully) 프로그램을종료할수있도록하는것이바람직하다.
(x,y) = (2,0) try: z = x/y except ZeroDivisionError: print ("0 으로나누는예외 ") 0 으로나누는예외
while True: try: n = input(" 숫자를입력하시오 : ") n = int(n) break except ValueError: print(" 정수가아닙니다. 다시입력하시오. ") print(" 정수입력이성공하였습니다!") 숫자를입력하시오 : 23.5 정수가아닙니다. 다시입력하시오. 숫자를입력하시오 : 10 정수입력이성공하였습니다!
try: fname = input(" 파일이름을입력하세요 : ") infile = open(fname, "r") except IOError: print(" 파일 " + fname + " 을발견할수없습니다.") 파일이름을입력하세요 : kkk.py 파일 kkk.py 을발견할수없습니다.
try: fh = open("testfile", "w") fh.write(" 테스트데이터를파일에씁니다!!") except IOError: print("error: 파일을찾을수없거나데이터를쓸수없습니다. ") else: print(" 파일에성공적으로기록하였습니다. ") fh.close() 파일에성공적으로기록하였습니다.
파일은텍스트파일과이진파일로나누어진다. 파일은연후에입출력이끝나면반드시닫아야한다. 파일에서데이터를읽거나쓰는함수는 read() 와 write() 함수이다. 텍스트파일에서한줄을읽으려면 for 루프를사용한다. 예외처리는오류가발생했을때프로그램을우아하기종료하는방법이다. try 블록과 except 블록으로이루어진다.