파일 입출력을 알기 전에
파일 입출력을 알기 전에 알아야 하는 개념이 있다.
파일의 논리적 구조
- 파일 안에는 byte들이 순차적으로 저장되어 있다.
- 파일의 맨 끝에는 EOF(end-of-file)마커가 있다.
파일 포인터
파일의 입출력 동작이 발생하는 위치를 파일 포인터라고 한다.
- 파일을 처음 열면, 파일 포인터는 파일의 첫 번째 바이트를 가리킨다.
- 파일의 내용을 읽거나 쓰면 파일 포인터는 자동으로 업데이트(다음 바이트를 가리킴)된다.
파일 열고 닫기
파일 열기
open()함수를 이용하여 파일을 열 수 있다.
close()함수를 이용하여 파일을 닫을 수 있다.
- open() : 파일의 이름을 받아서 파일 객체를 생성한 후 이를 반환
- close() : 파일 객체가 가지고 있는 close()메소드 호출 시 파일 닫힘
open()함수로 파일을 열 때, 어떤 모드로 작업을 할 것인지 명시해야 한다.
파일 모드 | 모드 이름 | 설명 |
r | 읽기 모드 | 처음 부터 읽는다 |
w | 쓰기 모드 | 처음부터 쓴다. 파일이 없으면 생성된다. 파일이 존재하면 기존의 내용은 지워진다. |
a | 추가 모드 | 파일의 끝에 쓴다. 파일이 없으면 생성된다. |
r+ | 읽기와 쓰기 모드 | 파일에 읽고 쓸 수 있는 모드이다. 모드를 변경하려면 seek()가 호출 되어야 함 |
file = open("input.txt", "r") #파일 열기(읽기 모드)
#명령
file.close() #파일을 열었으면 꼭 닫아주자
파일 닫기
파일 닫기는 기본적으로 close() 메소드를 이용하여 이루어지지만, 파일을 닫지 않았을 때, 닫히지 않은 파일 때문에 메모리가 계속 낭비되니 꼭 닫아줘야 한다. 아래의 내용은 프로그래머가 실수로 파일을 열고 닫지 않는 것을 방지하는 구문이다.
try - finally 구문 사용
파일을 열 때 오류가 발생되었을 때 사용한다.
finally구문은 오류가 나든 안 나든 무조건 실행되니, 파일을 확실히 닫을 수 있다.
try: # 예외가 발생할 가능성이 있는 작업들을 여기에 둔다.
infile = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
#여러가지 파일 처리 작업 코드 작성
finally:# try블록에서 예외 발생시 프로그램 종료 전 반드시 실행된다.
infile.close( )
with구문 사용
with 명령문 내의 블록이 종료될 때 파일이 자동으로 닫힘
close() 메소드 호출이 필요 없다
with open("input.txt", "r", encoding = "UTF8") as infile:
line = infile.readline().rstrip()
while line != "" :
print(line)
line = infile.readline()
파일 읽고 쓰기
파일 읽기
한 줄씩 읽기
파일을 열었다면 readline 메소드를 이용하여 한 줄씩 읽을 수 있다.
파일 포인터는 파일의 첫 위치에 있다가 readline 메소드 실행 시 다음 줄로 이동한다.
infile = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
line = infile.readline()
while line != "" :
print(line)
line = infile.readline()
#출력 결과
#홍길동
#
#김철수
코드에 보이는 encoding = "UTF8"은 뒤에서 설명하겠다.
이런 식으로 코드를 작성하면 출력 결과와 같이 줄 바꿈이 같이 출력된다.
그 이유는 line 변수 안에 줄 바꿈(\n)이 포함되어 있어서 그런 것이다.
이럴 때는 아래의 코드로 변경해보자
infile = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
line = infile.readline().rstrip() #rstrip을 이용하여 오른쪽에 줄바꿈 문자와 같은 공백 제거
while line != "" :
print(line)
line = infile.readline().rstrip()
#출력 결과
#홍길동
#김철수
encoding = "UTF8" -> 인코딩 방식 설정
인코딩(Encoding)은 문자를 바이트로 변환하는 것, 디코딩(Decoding)은 바이트를 문자로 변환하는 것을 말한다
그리고 그 변환하는 방식에 UTF-8, CP949, ANSI 등등이 존재하는데
인코딩과 디코딩 방식이 서로 일치해야 프로그램이 정상적으로 읽어낼 수 있다.
인코딩 방식을 설정하지 않으면, 메모장의 인코딩 방식과 파이썬의 디코딩 방식이 일치하지 않아 오류가 발생한다.
통째로 읽기
파일을 한줄 씩 말고 통째로 읽을 수도 있다.
read()메소드를 이용하면 된다.
with open("input.txt", "r", encoding = "UTF8") as infile:
all = infile.read()
print(all)
파일이 무척 크다면 많은 양의 메모리를 필요로 하기 때문에 주의가 필요하다
한 글자씩 읽기
read() 메소드에 매개변수로 1을 입력하면 한 글자씩 읽는다
with open("input.txt", "r", encoding = "UTF8") as infile:
one = infile.read(1)
while one != "":
print(one)
one = infile.read(1)
#출력 결과
#홍
#길
#동
#
#
#김
#철
#수
파일 쓰기
- “w”모드로 파일을 열었을 때 파일에 쓰기 가능
- wirte() 메소드 사용
with open("input.txt", "w", encoding = "UTF8") as infile:
infile.write("ReBugs\n")
실행을 해보면 input.txt파일에 ReBugs라고 적혀있는 것을 볼 수 있다.
w모드는 기존에 있던 내용을 초기화하고 새로 쓰는 것을 인지하길 바란다.
이어서 쓰고 싶으면 a모드를 사용하면 된다.
또한 변수의 값을 문자열에 포함시켜서 쓸 수 있다.
with open("input.txt", "w", encoding = "UTF8") as infile:
url = "https://rebugs.tistory.com/"
infile.write(f"ReBugs 주소 : {url}\n")
input.txt |
ReBugs 주소 : https://rebugs.tistory.com/ |
'Python Category > Python' 카테고리의 다른 글
[Python] 내장 함수 (0) | 2022.12.09 |
---|---|
[Python] 예외 처리 (2) | 2022.12.09 |
[Python] 모듈 (0) | 2022.12.08 |
[Python] 문자열 (1) | 2022.12.08 |
[Python] 딕셔너리 (0) | 2022.12.07 |