[파이썬] python 파일 생성 및 읽기 쓰기(I/O) 하는 방법 : read(), readlines(), open(), close(), write(), with(), readline()
파이썬 파일 생성하기 & 파일에 쓰기
옵션 | 설명 |
r | 파일을 읽기 |
w | 파일에 쓰기 |
a | 파일의 마지막 라인에 새로운 내용 추가 |
파이썬의 open메소드(함수)는 파일이름과 파일열기 모드를 인자(입력값)로 받습니다.
파일에 쓰기 위해서 ‘w’를 입력값으로 합니다.
파일생성(쓰기) 작업이 완료되면 close()를 호출하여 반드시 파일쓰기를 종료 해주어합니다.
쓰기모드로 열어던 파일을 닫지 않고 , 다시 사용하려고 할 경우 오류가 발생하기 때문입니다.
매번 사용할 때마다 close()를 해야한다면 참으로 불편할 수 있습니다.
그런 불편함을 해소하기위해 자동으로 파일의 열고 닫는 것을 처리해주는 with()문이 존재합니다. 하나씩 예제를 살펴봅니다.
파일을 생성하기 위해 파이썬 내장함수 open를 사용하였습니다.
>>> f = open("새파일.txt",'w') >>> f.close() >>>
그런데 새로 생성된 새파일.txt는 어느 경로에 파일이 생성되었을까요??
그것은 바로 파이썬이 설치된 경로입니다.
C:\Users\ilike\AppData\Local\Programs\Python\Python39 디렉터리 2020-12-01 오후 01:35 <DIR> . 2020-12-01 오후 01:35 <DIR> .. 2020-11-27 오전 11:53 <DIR> DLLs 2020-11-27 오전 11:52 <DIR> Doc 2020-11-27 오전 11:52 <DIR> include 2020-11-27 오전 11:52 <DIR> Lib 2020-11-27 오전 11:52 <DIR> libs 2020-10-05 오후 03:47 32,622 LICENSE.txt 2020-10-05 오후 03:47 1,020,400 NEWS.txt 2020-10-05 오후 03:47 100,368 python.exe 2020-10-05 오후 03:47 58,384 python3.dll 2020-10-05 오후 03:47 4,457,488 python39.dll 2020-10-05 오후 03:47 98,832 pythonw.exe 2020-11-27 오전 11:53 <DIR> Scripts 2020-11-27 오전 11:53 <DIR> tcl 2020-11-27 오전 11:52 <DIR> Tools 2020-10-05 오후 03:47 101,672 vcruntime140.dll 2020-10-05 오후 03:47 44,328 vcruntime140_1.dll 2020-12-01 오후 01:35 0 새파일.txt 9개 파일 5,914,094 바이트 10개 디렉터리 27,070,496,768 바이트 남음 C:\Users\ilike\AppData\Local\Programs\Python\Python39>
파일을 생성할때는 파일을 저장할 경로를 지정하는 것이 바람직합니다.
이번에는 빈파일이 아닌 파일에 문자열을 써보도록 하겠습니다. 로그파일 작성시 유효하게 사용될 수 도 있겠지요?
>>> f = open("c:\python\새파일.txt",'w') >>> for i in range(1,6): ... f.write("%d번째 줄입니다.\n" % i) ... 10 10 10 10 10 >>> f.close() >>>
잘못된 경로를 지정하게되면 No such file or directory 오류를 리턴합니다.
>>> f = open("c:\pyhton\새파일.txt",'w') Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: 'c:\\pyhton\\새파일.txt'
명령프롬프트로 이동하여 파일 생성 여부 및 파일 내용을 살펴볼게요.
도스명령어 dir는 폴더 내의 파일과 디렉토리 정보를 확인할 수 있는 명령어에요.
파일의 내용을 보기위해 type명령어를 사용하여 확인했습니다.
C:\>cd python C:\python>dir C 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 1C02-20EB C:\python 디렉터리 2020-12-01 오후 01:46 <DIR> . 2020-12-01 오후 01:46 <DIR> .. 2020-12-01 오후 12:57 <DIR> script 2020-12-01 오후 01:07 <DIR> Workspace 2020-12-01 오후 01:53 85 새파일.txt 1개 파일 85 바이트 4개 디렉터리 27,052,457,984 바이트 남음 C:\python> C:\python> C:\python> C:\python>type 새파일.txt 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. 4번째 줄입니다. 5번째 줄입니다. C:\python>
파이썬 파일에 새로운 내용추가 하는 방법
기존 파일에 내용을 추가하고 싶은 경우 파일추가 모드를 ‘a’를 사용하여 추가합니다.
만약 기존파일을 ‘w’모드로 열어서 쓰게 되면 덮어쓰기가 됨으로 기존에 모든 내용은 삭제됩니다.
>>> f = open("c:\python\새파일.txt",'a') >>> f.write("오늘은 수요일입니다.") 11 >>> f.write("오랜만에 햇님이 보이네요") 13 >>> f.close() >>> >>>
새로 추가한 문자열이 잘 추가되었는지 확인해봅니다.
C:\python>type 새파일.txt 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. 4번째 줄입니다. 5번째 줄입니다. 오늘은 수요일입니다.오랜만에 햇님이 보이네요 C:\python>
파이썬 파일 쓰기를 할 때 with문 사용하기
with문 블록을 벗어나면 자동으로 파일쓰는 작업이 종료됩니다.
C:\python>python Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> >>> with open("c:\python\새파일.txt",'a') as f: ... f.write("\nwith문을 사용하여 새로운 문장을 추가합니다.") ... f.write("\nwith문 사용시 들여쓰기는 필수 입니다.") ... f.write("\nwith문 블록을 벗어나는 순간 f객체는 자동으로 close처리 됩니다.") ... 27 24 41 >>> exit()
with문을 사용한 결과를 살펴봅니다.
C:\python> C:\python>type 새파일.txt 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. 4번째 줄입니다. 5번째 줄입니다. 오늘은 수요일입니다.오랜만에 햇님이 보이네요 with문을 사용하여 새로운 문장을 추가합니다. with문 사용시 들여쓰기는 필수 입니다. with문 블록을 벗어나는 순간 f객체는 자동으로 close처리 됩니다. C:\python>
파이썬 파일의 내용을 읽어오는 방법
파이썬에는 외부 파일을 읽어와 프로그램에서 사용할 수 있는 방법이 있습니다.
readline()메소드를 사용하는 방법과 readlines()메소드를 사용하는 방법 및 read()메소드를 사용하는 방법이 있습니다.
첫번째 방법으로 접근해봅니다. 파일에 내용을 읽어올 때는 파일 열기 모드를 ‘r’를 사용합니다.
>>> f = open("c:\python\새파일.txt",'r') >>> print(f.readline()) 1번째 줄입니다. >>> print(f.readline()) 2번째 줄입니다. >>> print(f.readline()) 3번째 줄입니다. >>> f.close() >>>
>>> >>> f.close() >>> f = open("c:\python\새파일.txt",'r') >>> while True: ... a = f.readline() ... if not a: ... break ... print(a) ... 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. 4번째 줄입니다. 5번째 줄입니다. 오늘은 수요일입니다.오랜만에 햇님이 보이네요 with문을 사용하여 새로운 문장을 추가합니다. with문 사용시 들여쓰기는 필수 입니다. with문 블록을 벗어나는 순간 f객체는 자동으로 close처리 됩니다. >>> f.close() >>>
두번째 방법은 readlines()를 사용하는 방법입니다.
readlines()함수는 파일의 모든 줄을 읽어 list 타입의 자료형으로 리턴합니다.
리스트 타입의 자료형 아시죠? a = [“1번째 줄입니다.”,”2번째 줄입니다.” ………….]
>>> f = open("c:\python\새파일.txt",'r') >>> tmp = f.readlines() >>> for item in tmp: ... print(item) ... 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. 4번째 줄입니다. 5번째 줄입니다. 오늘은 수요일입니다.오랜만에 햇님이 보이네요 with문을 사용하여 새로운 문장을 추가합니다. with문 사용시 들여쓰기는 필수 입니다. with문 블록을 벗어나는 순간 f객체는 자동으로 close처리 됩니다 >>> f.close() >>>
세번째 방법으로 read메소드(함수)를 사용하는 방법입니다.
read()함수는 파일의 전체 내용을 리턴합니다.
>>> >>> f = open("c:\python\새파일.txt",'r') >>> print( f.read() ) 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. 4번째 줄입니다. 5번째 줄입니다. 오늘은 수요일입니다.오랜만에 햇님이 보이네요 with문을 사용하여 새로운 문장을 추가합니다. with문 사용시 들여쓰기는 필수 입니다. with문 블록을 벗어나는 순간 f객체는 자동으로 close처리 됩니다. >>> >>> f.close() >>>
마지막으로 출력하는 방법이 있습니다. sys모듈의 stduot.writelines()메소드를 사용하여 범위를 지정하여 읽어올 수 있습니다.
마지막줄을 읽어오고 싶은 경우 -1을 범위로지정하면 됩니다.
>>>import sys >>> f = open("c:\python\새파일.txt",'r') >>> a = f.readlines() >>> sys.stdout.writelines( a[:3]) 1번째 줄입니다. 2번째 줄입니다. 3번째 줄입니다. >>> >>> >>> sys.stdout.writelines( a[4:8]) 5번째 줄입니다. 오늘은 수요일입니다.오랜만에 햇님이 보이네요 with문을 사용하여 새로운 문장을 추가합니다. with문 사용시 들여쓰기는 필수 입니다. >>> >>> >>> sys.stdout.writelines( a[-1]) with문 블록을 벗어나는 순간 f객체는 자동으로 close처리 됩니다.>>> >>> >>> >>>f.close()
파이썬 폴더 없으면 생성하는 방법
지정 경로에 디렉토리가 존재하지 않으면 디렉토로(directory)를 생성하려면 path.isdir()함수를 사용하여 디렉토리 존재여부를 체크합니다.
그런 다음 os.mkdir()함수를 사용하여 폴더를 생성합니다.
또는 os.makedirs()함수를 사용하여 생성합니다.
mkdir함수와 makedirs함수의 차이점은 전자는 하나의 폴더만 생성가능합니다.
후자는 여러개의 폴더를 동시에 모두 생성합니다.
import os path = "C:/test" if not os.path.isdir(path): os.mkdir(path) f = open(path+"/test_942.txt", 'a') f.write('\n\n------------------------------ 메인화면 등록 ------------------------------\n') for item in dict_list: f.write(str(item) + "\n") f.close()
폴더가 여러개인데 mkrdir()함수를 사용하면 “FileNotFoundError: [WinError 3] 지정된 경로를 찾을 수 없습니다.” 오류가 발생해요.
이럴때는 os.mkdir()대신 os.makedirs()함수를 사용하여 처리합니다.
path = "C:/test/request/win" if not os.path.isdir(path): os.mkdir(path) f = open(path+"/test_942.txt", 'a') for item in dict_list: f.write(str(item) + "\n") f.close() #실행결과 Traceback (most recent call last): File "C:\python\Workspace\main.py", line 84, in <module> os.mkdir(path) FileNotFoundError: [WinError 3] 지정된 경로를 찾을 수 없습니다: 'C:/test/request/win'
파일 쓰기시 UnicodeEncodeError: ‘cp949’ codec can’t encode character ‘\u20a9′ in position 486: illegal multibyte sequence 오류가 발생하는 경우 encoding=’cp949’ 처리를 해주면 해결할 수 있습니다.
fine_name = "xbox_list_" + str(file_name) + ".txt" f = open(path + fine_name, 'w', encoding='cp949') f.write(html) f.close()
위와 같이 처리해도 동일한 오류가 발생한다면 utf-8로 처리하세요.
path = "C:/a_list/" if not os.path.isdir(path): os.makedirs(path) fine_name = "_list_" + str(file_name) + ".txt" f = open(path + fine_name, 'w', encoding='utf-8') #encoding='cp949' f.write(html) f.close()