지난 글에 이어서 Python을 통해 파일을 활용하는 방법에 대해 알아보겠습니다.
파일 처리에 활용하는 함수
- open: 불러올 파일을 지정하고 읽기인지 쓰기인지 정함
- read: 파일 전체 내용을 문자열로 읽어온다
- readline: 하나의 줄만 읽어옴(txt)
- readlines: 파일 전체 내용을 한 줄씩 리스트로 만들어줌(txt)
- write: 파일에 씀
- writelines: txt 파일에만 씀
open 함수를 통해 파일을 열 수 있습니다. input 되는 변수에 따라 모드를 지정할 수 있는데요, 변수는 다음과 같습니다.
- r: 읽기, 생략 시 읽기가 기본 모드
- w: 쓰기, 기존 파일이 있을 경우 덮어쓰기
- r+: 읽기, 쓰기
- a: 쓰기, 기존 파일이 있을 경우 이어서 쓰기
- t: 텍스트 파일용
- b: 바이너리 파일용
파일 읽기
그러면 예시를 통해 더 자세히 알아봅시다. 먼저 저는 D:\Download\Python\에 data.txt라는 파일을 만들고 다음과 같이 입력하고 저장하도록 하겠습니다.
엄마가 섬그늘에
굴 따러 가면
아기가 혼자 남아
집을 보다가그리고 다음과 같이 코드를 작성해서 실행해 봅시다.
#변수 선언
file = None
a = ""
#파일 불러오기
file = open("D:\Download\Python\data.txt","r",encoding="utf-8")
a = file.readline()
print(a)
>> 엄마가 섬그늘에
>>먼저 변수가 선언되고 file 변수를 통해 텍스트 파일을 불러왔습니다. 읽기(r)로 불러왔고 인코딩 방식은 UTF-8 방식으로 설정했습니다. 이게 무슨 말인지는 계속해서 알아보도록 하겠습니다. 그리고 readline으로 한 줄을 읽어왔습니다. 그런데 print를 하니까 한 줄이 더 print가 되는데요, end를 사용해 이를 해결할 수 있습니다.
file = None
a = ""
file = open("D:\Download\Python\data.txt","r",encoding="utf-8")
a = file.readline()
print(a, end = "")
>> 엄마가 섬그늘에위의 예시에서는 첫 번째 줄만 읽어왔는데요, 다 읽어오려면 어떻게 해야 할까요?? readline을 여러 번 하면 됩니다.
file = None
a = ""
file = open("D:\Download\Python\data.txt","r",encoding="utf-8")
a = file.readline()
print(a, end = "")
a = file.readline()
print(a, end = "")
a = file.readline()
print(a, end = "")
>> 엄마가 섬그늘에
>> 굴 따러 가면
>> 아기가 혼자 남아그리고 open을 했다면, 코드 마지막에 close를 해줘야 합니다.
file = None
a = ""
file = open("D:\Download\Python\data.txt","r",encoding="utf-8")
a = file.readline()
print(a, end = "")
a = file.readline()
print(a, end = "")
a = file.readline()
print(a, end = "")
file.close()readlines를 활용해서 여러 줄을 한 번에 읽어올 수도 있습니다.
file = None
a = ""
file = open("D:\Download\Python\data.txt","r",encoding="utf-8")
a = file.readlines()
print(a)
file.close()
>> ['엄마가 섬그늘에\n', '굴 따러 가면\n', '아기가 혼자 남아\n', '집을 보다가']readlines는 리스트로 저장되는 거니까 print 보기가 불편하네요, 코드를 다음과 같이 수정해 봅시다.
file = None
a = ""
file = open("D:\Download\Python\data.txt","r",encoding="utf-8")
a = file.readlines()
for i in a :
print(i, end = "")
file.close()
>> 엄마가 섬그늘에
>> 굴 따러 가면
>> 아기가 혼자 남아
>> 집을 보다가그런데 만약 지정된 경로에 파일이 없다면 어떻게 될까요?? 그럼, 다음과 같은 오류가 출력됩니다.
Traceback (most recent call last):
File "D:\Download\Python\00.py", line 4, in <module>
file = open("D:\Download\Python\data1.txt","r",encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'D:\Download\Python\data1.txt'이러면 굉장히 불편하니까 함수를 불러와서 문제를 해결해 봅시다. 이번에는 input을 활용해서 경로를 설정해 보도록 하겠습니다.
import os
#변수 선언
file = None
fileName, List, String = "", [], ""
fileName = input("경로 설정: ")
if os.path.exists(fileName) :
file = open(fileName,"r",encoding="utf-8")
List = file.readlines()
for String in List :
print(String, end = "")
file.close()
else :
print("해당 경로가 존재하지 않습니다")
>> 경로 설정: D:\Download\Python\data1.txt
>> 해당 경로가 존재하지 않습니다os의 path.exists 함수를 활용해서 경로가 존재할 때만 파일을 불러와서 값을 읽고, 경로가 존재하지 않을 경우 경로가 없다고 알려주는 코드입니다.
파일 쓰기
file = None
String = ""
file = open("D:\Download\Python\data1.txt","w",encoding="utf-8")
while True :
String = input("파일에 쓸 내용: ")
if String != "" :
file.writelines(String + "\n")
else :
break
file.close()
print("파일 쓰기 완료")
>> 파일에 쓸 내용: 엄마가
>> 파일에 쓸 내용: 섬그늘에
>> 파일에 쓸 내용: 굴따러
>> 파일에 쓸 내용: 가면
>> 파일에 쓸 내용:
>> 파일 쓰기 완료코드를 보면 먼저 변수 선언을 하고 파일 경로를 지정했습니다. 지금은 쓰기 모드이므로 경로가 존재하지 않아도 됩니다.
while 문 안에서 input 함수를 통해 파일에 쓸 내용을 입력받고 만약 입력하지 않으면 break를 통해 마무리됩니다. 그 결과 해당 경로에 파일이 생성되고 입력된 값이 써진 것을 확인할 수 있습니다.
파일 읽기/쓰기 활용 (파일 복사)
그러면 이전까지 알아본 파일 읽기/쓰기 함수를 활용해서 복사 프로그램을 만들어볼까요??
#변수 선언
Rfile, Wfile = None, None
List, String = [], ""
#경로 설정
Rfile = open("D:\Download\Python\data.txt","r",encoding="utf-8")
Wfile = open("D:\Download\Python\data0.txt","w",encoding="utf-8")
#파일 복사
List = Rfile.readlines()
for String in List :
Wfile.writelines(String)
Rfile.close()
Wfile.close()
print("파일 복사 완료")
>> 파일 복사 완료프로그램 실행 결과 파일이 정상적으로 복사된 것을 확인할 수 있습니다.
References: 위키독스