이미지 출처: https://wikidocs.net/192339
파이썬 파일 읽고 쓰기를 배워보겠습니다.
외부에서 우리가 수집하거나 작성한 어떤 텍스트 파일, csv 파일들을 읽어와서 웹상에 있는 텍스트, 되부 데이터들을 read하거나 쓰는 작업들을 해보겠습니다.
파일 Write 실습(1)
읽기 모드 : r
쓰기모드 : w
추가모드 : a
텍스트모드 : t(기본값)
바이너리 모드 : b
상대경로('../, ./') : 현재 작업 중인 디렉토리나 위치를 기준으로 파일이나 폴더의 경로를 나타내는 방식(상대경로는 현재 폴더의 위치부터 따지는것)
절대 경로('C:\Django\example..') : 절대경로는 파일이나 폴더의 경로를 루트 디렉토리부터 전체 경로로 나타내는 방식(절대경로는 내가 어디에있든 어떤경로에서 작업을 하든 루트경로부터 따지기에 코드가 어디서든 실행된다.)
예1
open함수는 외부에 있는 파일을 연결해주는 함수
f에는 외부에있는 파일과 it_news파일을 연결해주는 기능이 있는데 그것이 open함수
텍스트는 기본값이기 때문에 rt가 아니라 그냥 r로 해도 된다.
저는 제공받은 폴더를 제가 작업하는 공간에 옮겨놓았습니다. 그곳에 txt파일과 csv파일 여러개가 있씁니다. 여러분도 임의로 아무파일을 만들어서 넣어서 실습해봐도 좋을 것 같습니다.
# 현재는 같은 작업공간에 있기에 상대경로로 작성했지만 절대경로도 가능하다. # 작성된 파일의 원문이 어떤 인코등으로 작성을 했는지 알아야 파일을 온전히 불러올 수 있다. # open함수는 첫번째 인자로 파일의 위치를 받는다. 두번째 인자로는 r,w,a같은 옵션이들어간다 # 마지막 인자는 인코딩, 파이썬에서는 생략하면 기본 UTF-8로 인코딩한다. f = open('./resource/it_news.txt','r', encoding = 'UTF-8') >>> 실행하면 오류가 발생하지 말아야 한다. # 속성 확인 현재 파일과 연결된 상태에서 사용할 수 있는 메소드들이 나온다. print(dir(f)) >>> ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines'] # 인코딩 확인 print(f.encoding) >>> UTF-8 # 파일 이름 print(f.name) >>> ./resource/it_news.txt # 모드 확인 print(f.mode) >>> r (read) cts = f.read() # txt내용을 읽어와서 불러온다. print(cts) >>> Right now gamers can pay just $1 for access to hundreds of titles across PC and Xbox via Microsoft Xbox Game Pass Ultimate service?but dont activate that insanely cheap one-month trial just yet. You can lock in up to three years of Xbox Game Pass Ultimate with that same dollar if you play your cards right. ---------------------------------------------------------------------------- When you activate Microsoft’s E3 2019 promotion, it not only begins the trial, but also converts existing Xbox Live Gold and standard Xbox Game Pass subscriptions on your account to Game Pass Ultimate (normally $15 per month). Any prepaid time up to the maximum of three years gets the upgra # 반드시 close f.close() print()
예2
보통 위의예제처럼 코드를 쓰지 않습니다. close()를 해야하고 파일을 읽어서 처리하는 작업이 들어가기 때문입니다.
with문을 사용하면 with문에 있는 내용을 모두 실행하고 나올때 파이썬 내부적으로 with에서 사용했던 리소스들을 저절로 반환해준다 -> close호출하지 않아도 내부적으로 리소스가 닫힌다.
with open('./resource/it_news.txt','r', encoding = 'UTF-8') as f: c = f.read() print(c) print(iter(c)) print(list(c)) >>> Right now gamers can pay just $1 for access to hundreds of titles across PC and Xbox via Microsoft Xbox Game Pass Ultimate service?but dont activate that insanely cheap one-month trial just yet. You can lock in up to three years of Xbox Game Pass Ultimate with that same dollar if you play your cards right. -------------------------------------------------------------------------- When you activate Microsoft’s E3 2019 promotion, it not only begins the trial, but also converts existing Xbox Live Gold and standard Xbox Game Pass subscriptions on your account to Game Pass Ultimate (normally $15 per month). Any prepaid time up to the maximum of three years gets the upgrade. <str_iterator object at 0x0000020B1B71E1A0> ['R', 'i', 'g', 'h', 't', ' ', 'n', 'o', 'w', ' ', 'g', 'a', 'm', 'e', 'r', 's', ' ', 'c', 'a', 'n', ' ', 'p', 'a', 'y', ' ', 'j', 'u', 's', 't', ' ', '$', '1', ' ', 'f', 'o', 'r', ' ', 'a', 'c', 'c', 'e', 's', 's', ' ', 't', 'o', ' ', 'h', 'u', 'n', 'd', 'r', 'e', 'd', 's', ' ', 'o', 'f', ' ', 't', 'i', 't', 'l', 'e', 's', ' ', 'a', 'c', 'r', 'o', 's', 's', ' ', 'P', 'C', ' ', '\n', 'a', 'n', 'd', ' ', 'X', 'b', 'o', 'x', ' ', 'v', 'i', 'a', ' ', 'M', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', ' ', 'X', 'b', 'o', 'x', ' ', 'G', 'a', 'm', 'e', ' ', 'P', 'a', 's', 's', ' ', 'U', 'l', 't', 'i', 'm', 'a', 't', 'e', ' ', 's', 'e', 'r', 'v', 'i', 'c', 'e', '?', 'b', 'u', 't', ' ', 'd', 'o', 'n', 't', ' ', '\n', 'a', 'c', 't', 'i', 'v', 'a', 't', 'e', ' ', 't', 'h', 'a', 't', ' ', 'i', 'n', 's', 'a', 'n', 'e', 'l', 'y', ' ', 'c', 'h', 'e', 'a', 'p', ' ', 'o', 'n', 'e', '-', 'm', 'o', 'n', 't', 'h', ' ', 't', 'r', 'i', 'a', 'l', ' ', 'j', 'u', 's', 't', ' ', 'y', 'e', 't', '.', ' ', 'Y', 'o', 'u', ' ', 'c', 'a', 'n', ' ', 'l', 'o', 'c', 'k', ' ', 'i', 'n', ' ', 'u', 'p', ' ', 't', 'o', ' ', '\n', 't', 'h', 'r', 'e', 'e', ' ', 'y', 'e', 'a', 'r', 's', ' ', 'o', 'f', ' ', 'X', 'b', 'o', 'x', ' ', 'G', 'a', 'm', 'e', ' ', 'P', 'a', 's', 's', ' ', 'U', 'l', 't', 'i', 'm', 'a', 't', 'e', ' ', 'w', 'i', 't', 'h', ' ', 't', 'h', 'a', 't', ' ', 's', 'a', 'm', 'e', ' ', 'd', 'o', 'l', 'l', 'a', 'r', ' ', 'i', 'f', ' ', 'y', 'o', 'u', ' ', 'p', 'l', 'a', 'y', ' ', '\n', 'y', 'o', 'u', 'r', ' ', 'c', 'a', 'r', 'd', 's', ' ', 'r', 'i', 'g', 'h', 't', '.', '\n', '\n', 'W', 'h', 'e', 'n', ' ', 'y', 'o', 'u', ' ', 'a', 'c', 't', 'i', 'v', 'a', 't', 'e', , 'y', 'o', 'u', ' ', 'a', 'c', 't', 'i', 'v', 'a', 't', 'e', ' ', 'M', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', '’', 's', ' ', 'E', '3', ' ', '2''n', ',', ' ', 'i', 't', ' ', 'n', 'o', 't', ' ', 'o', 'n', 'l, '0', '1', '9', ' ', 'p', 'r', 'o', 'm', 'o', 't', 'i', 'o', 'n', ',', ' ', 'i', 't', ' ', 'n', 'o', 't', ' ', 'o', 'n', 'l', 'y', ' ', 'b', 'e'o', ' ', 'c', 'o', 'n', 'v', 'e', 'r', 't', 's', ' ', 'e', 'x', 'g', 'i', 'n', 's', ' ', 't', 'h', 'e', ' ', 't', 'r', 'i', 'a', 'l', ',', ' ', '\n', 'b', 'u', 't', ' ', 'a', 'l', 's', 'o', ' ', 'c', 'o', 'n, 'n', 'd', 'a', 'r', 'd', ' ', 'X', 'b', 'o', 'x', ' ', 'G', ', 'v', 'e', 'r', 't', 's', ' ', 'e', 'x', 'i', 's', 't', 'i', 'n', 'g', ' ', 'X', 'b', 'o', 'x', ' ', 'L', 'i', 'v', 'e', ' ', 'G', 'o', 'l', 'd 'u', 'r', ' ', 'a', 'c', 'c', 'o', 'u', 'n', 't', ' ', 't', '', ' ', 'a', 'n', 'd', ' ', 's', 't', 'a', 'n', 'd', 'a', 'r', 'd', ' ', 'X', 'b', 'o', 'x', ' ', 'G', 'a', 'm', 'e', ' ', 'P', 'a', 's', 's', ' y', ' ', '$', '1', '5', ' ', 'p', 'e', 'r', ' ', '\n', 'm', 'o ', '\n', 's', 'u', 'b', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 's', ' ', 'o', 'n', ' ', 'y', 'o', 'u', 'r', ' ', 'a', 'c', 'c', 'o', 'u', '', 't', 'h', 'e', ' ', 'm', 'a', 'x', 'i', 'm', 'u', 'm', ' ',n', 't', ' ', 't', 'o', ' ', 'G', 'a', 'm', 'e', ' ', 'P', 'a', 's', 's', ' ', 'U', 'l', 't', 'i', 'm', 'a', 't', 'e', ' ', '(', 'n', 'o', 'r', ' 'd', 'e', '.', '\n', '\n']m', 'a', 'l', 'l', 'y', ' ', '$', '1', '5', ' ', 'p', 'e', 'r', ' ', '\n', 'm', 'o', 'n', 't', 'h', ')', '.', ' ', 'A', 'n', 'y', ' ', 'p', 'r', 'e', 'p', 'a', 'i', 'd', ' ', 't', 'i', 'm', 'e', ' ', 'u', 'p', ' ', 't', 'o', ' ', 't', 'h', 'e', ' ', 'm', 'a', 'x', 'i', 'm', 'u', 'm', ' ', 'o', 'f', ' ', 't', 'h', 'r', 'e', 'e', ' ', 'y', 'e', 'a', 'r', 's', ' ', 'g', 'e', 't', 's', ' ', 't', 'h', 'e', ' ', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '.', '\n', '\n']
예2
read() : 전체 읽기
read(10) : 10Byte (열글자만 읽어온다!)
with open('./resource/it_news.txt','r', encoding = 'UTF-8') as f: c = f.read(20) # 20Byte만큼 읽어온다. print(c) >>> Right now gamers can (공백포함 20글자)
with open('./resource/it_news.txt','r', encoding = 'UTF-8') as f: c = f.read(20) # 20Byte만큼 읽어온다. print(c) c= f.read(20) # 커서가 있다. 내가 마지막에 읽었는지를 이 내부적으로 기억하고 있다. print(c) >>> Right now gamers can >>> pay just $1 for acc (20글자를 불러온뒤 이어서 20글자를 불러온다.)
with open('./resource/it_news.txt','r', encoding = 'UTF-8') as f: c = f.read(20) print(c) c= f.read(20) print(c) f.seek(0.0) # 처음부터 다시 읽는다. c = f.read(20) print(c) >>> ### seek(0.0)때문에 다시 불러온다. Right now gamers can pay just $1 for acc Right now gamers can
예3
readline : 한 줄 씩 읽기
with open('./resource/it_news.txt','r', encoding = 'UTF-8') as f: line = f.readline() # 반복문 안에서 루프를 돌면서 출력해주는 것이 좋다. print(line) line = f.readline() print(line) >>> Right now gamers can pay just $1 for access to hundreds of titles across PC >>> and Xbox via Microsoft Xbox Game Pass Ultimate service?but dont
예4
with open('./resource/it_news.txt','r', encoding = 'UTF-8') as f: cts = f.readlines() print(cts) print() for c in cts: print(c, end='') >>> ['Right now gamers can pay just $1 for access to hundreds of titles across PC \n', 'and Xbox via Microsoft Xbox Game Pass Ultimate service?but dont \n', 'activate that insanely cheap one-month trial just yet. You can lock in up to \n', 'three years of Xbox Game Pass Ultimate with that same dollar if you play \n', 'your cards right.\n', '\n', 'When you activate Microsoft’s E3 2019 promotion, it not only begins the trial, \n', 'but also converts existing Xbox Live Gold and standard Xbox Game Pass \n', 'subscriptions on your account to Game Pass Ultimate (normally $15 per \n', 'month). Any prepaid time up to the maximum of three years gets the upgrade.\n', '\n'] # for문으로 리스트를 출력 >>> Right now gamers can pay just $1 for access to hundreds of titles across PC and Xbox via Microsoft Xbox Game Pass Ultimate service?but dont activate that insanely cheap one-month trial just yet. You can lock in up to three years of Xbox Game Pass Ultimate with that same dollar if you play your cards right. When you activate Microsoft’s E3 2019 promotion, it not only begins the trial, but also converts existing Xbox Live Gold and standard Xbox Game Pass subscriptions on your account to Game Pass Ultimate (normally $15 per month). Any prepaid time up to the maximum of three years gets the upgrade.
이제는 파일을 써보는 코딩을 해봅시다.
예1
with open('./resource/contents1.txt', 'w') as f: f.write('I love python\n') # contents1.txt파일을 확인해보자. >>> I love python # 제대로 작성되어 있다.
예2
기존에 파일 contents1.txt파일에 a(append)옵션을 이용해 추가로 파일을작성하면 기존의 내용뒤에 삽입된다.
with open('./resource/contents1.txt', 'a') as f: f.write('I love python2') >>> I love python >>> I love python2
예3
# 리스트에 있는 요소들을 줄바꿈하여 작성한다. with open('./resource/contents2.txt', 'w') as f: list = ['Orange\n', 'Apple\n', 'Banana\n', 'Melon\n'] f.writelines(list) >>> Orange Apple Banana Melon
예4
# 프린트문이 파일로 출력 # 자주 사용하지는 않을 것 같다. with open('./resource/contents3.txt', 'w') as f: print('Test Text Write!', file = f) print('Test Text Write!', file = f) print('Test Text Write!', file = f) >>> Test Text Write! Test Text Write! Test Text Write!
다음시간에는 데이터분석에서 많이 쓰이는 csv파일을 읽고 쓰는 방법을 배우겠습니다.😎