13. 파일 읽고 쓰기 > 파이썬 기초

본문 바로가기

사이트 내 전체검색

이전으로파이썬 기초

13. 파일 읽고 쓰기

페이지정보

글쓴이 관리자 조회 29,713 조회 날짜 19-05-07 16:54 / U:19-11-12 16:26
댓글 0댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

파일 읽고 쓰기

 

컴퓨터에 사용되는 파일의 종류는 다양하다.

 

text 파일, image, data, DB 등등.. 

 

하지만 크게 두 종류로 보면 된다. 사람이 직접 눈으로 읽을 수 있는 파일인가 아닌가...

 

눈으로 내용을 직접 읽을 수 있는 파일은 text 파일이다. 윈도우 기반 운영체제에서 나오는 txt 확장자가 붙은 파일, 즉 메모장으로 다룰 수 있는 파일을 말한다.

 

그리고 나머지 종류는 포맷에 따라 다른긴 한데, 대부분 전용 프로그램으로 컴파일된 결과물이라 사람 눈으로는 내용을 알 수 없다. 

그래서 이미지 파일은 이미지를 읽을 수 있는 이미지 뷰어를 사용하고, 각 파일에 적합한 프로그램을 사용해서 내부적으로 가공된 결과만을 볼 수 있다.

 

일반적으로 프로그래밍 언어에서 말하는 파일을 접근해서 내용을 작성하고 저장하는 것은 text 파일을 말한다. 

 

파이썬에서 파일을 읽고 쓰는 방법을 알아보자.

 

 

1. 파일 생성하기

 

파일을 생성하기 위해서는 open이라는 내장 함수를 사용한다. open함수는 "파일 이름"과 "파일 접근 모드"를 인수로 받으며, 결과값으로 파일 객체를 반환한다.

 

파일 생성 기본 구문

파일 객체 = open(파일 이름, 파일 접근 모드)

 

파일 열기 예

f = open("새파일.txt", 'w')

f.close()

 

파일 이름은 경로를 포함한다. 경로는 절대 경로와 상대 경로를 모두 사용할 수 있다. 

절대경로란 그 위치를 정확하게 가리키는 경로이다. 컴퓨터구조의 처음부터 파일이 있는 위치를 모두 기록하는 방식이다.

상대경로란 프로그램이 실행되는 위치(폴더, 디렉토리)를 기준으로 앞으로 몇칸, 뒤로 몇칸에 있는 파일.. 이라고 기록하는 방식이다. 자신이 있는 폴더는 ( ./ ) 이다.  

 

절대 경로 형식 : "C:\JBMPA\lecture\testfile.txt"

상대 경로 형식 : ".\files\testfile.txt"

 

파일 이름에 절대 경로를 적어주면, 그 경로에 파일이 생성된다. 상대 경로를 적어주면 프로그램이 실행되는 위치를 기준으로 상대적인 경로에 파일이 생성된다.

 

예제처럼 "새파일.txt"라고 적었다면, 파이썬 파일이 존재하고 실행되는 그 위치의 폴더(디렉토리)에 "새파일.txt"가 생성된다.

 

파일 접근 모드는 다음과 같다.

 

파일접근모드

설명

r

읽기 모드 - 파일을 읽기만 할 때 사용. read

w

쓰기 모드 - 파일에 내용을 쓸 때 사용, 기존 내용 모두 삭제됨. write

a

추가 모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용. append

 

 

파일을 쓰기 모드(w)로 접근하게 되면, 파일이 존재하면 그 파일을 쓰기 모드로 열게 된다. 쓰기 모드는 말 그대로 파일에 내용을 쓰기 위한 것이므로 기존에 있던 내용들이 모두 사라지고 새로 내용을 쓰게 된다. 

파일이 존재하지 않으면 새로운 파일이 생성된다.

 

파일에 대한 작업이 모두 끝나면 파일 객체를 닫아줘야 한다. f라는 객체를 close 해야 한다는 의미이다.

만약 작업중인 파일을 닫지 않는다면, 그 파일은 파일 객체(프로세스)가 선점하고 있으므로, 다른 프로세스가 접근할 수 없다.

우리가 윈도우에서 작업할 때, 열어놓은 파일을 삭제하려면 "파일이 열려있어 삭제할 수 없습니다." 와 같은 오류 메세지가 나는 이유라고 보면 된다.

따라서 모든 파일 작업이 끝나면 f.close()를 작성해주도록 한다.

 

인코딩 설정하기

 

windows 시스템에서 기본 encoding은 'cp949'이다. 만약 파일안에 다양한 형태의 문자가 들어갈때, 'cp949' 코덱으로 특수 문자를 제대로 인코딩하지 못하는 'illegal multibyte sequence' 에러가 발생하게 된다.

따라서 파일을 open할때 encoding할 방법을 명시적으로 적어줌으로 에러를 방지할 수 있다.

 

인코딩을 적용한 파일 생성 기본 구문

파일 객체 = open(파일 이름, 파일 접근 모드, endcoding='UTF8')

 

인코딩을 적용한 파일 열기 예

f = open("새파일.txt", 'w', encoding='UTF8')

f.close()

 

 

2. 파일 쓰기

 

파일을 열고, 내용을 입력해본다.

 

f = open("새파일.txt", 'w')    

data = "안녕하세요. JBMPA입니다."

f.write(data)

f.close()

 

위의 코드를 실행하면, 콘솔화면에는 아무것도 나오지 않는다. 콘솔화면은 print() 명령으로 나타나며, 위의 예제는 data라는 텍스트를 f객체 즉, "새파일.txt"에 내용을 출력했다. 

프로그램 입장에서는 출력이지만, 파일 입장에서는 받아들인 것이므로 입력이 된다. 파일에 내용을 쓰는 것이므로 write() 함수를 사용한다.

 

패키지 탐색기에 "새파일.txt"가 존재하지 않는다.

 

코드를 실행해 본다. 실행 후에도 콘솔화면에는 아무것도 나타나지 않는다.

 

1269732368_1557518476.4537.png

 

 

윈도우 탐색기를 통해 파이썬 파일이 있는 폴더에 접근한다.

프로젝트 폴더가 "C:\JBMPA\lecture" 이므로, C:\JBMPA\lecture 위치로 접근한다.

쓰기 모드로 파일을 열었기 때문에, "새파일.txt" 파일이 생성해 있는 것을 알 수 있다.

 

1269732368_1557518524.6942.png

 

 

"새파일.txt"를 열어보면 아래와 같이 내용이 입력되어 있는 것을 확인할 수 있다.

1269732368_1557518616.305.png

 

 

3. 파일 읽기

 

생성된 파일의 내용은 파일 객체를 통해 읽어 들일 수 있다. 파일을 읽을 때는 읽기 모드(r)로 접근한다.

파일 내용을 읽어들일 때는 다양한 방법이 있다. 

 

파일 읽기 메서드

설명

readline()

파일에 접근해서 제일 처음 한줄 만 읽어서 저장하고, 커서를 다음 줄로 내리기

readlines()

파일의 모든 내용을 한줄 씩 읽어서, 한줄 씩 리스트에 저장하기

read()

파일 내용 전체를 읽어서 하나의 문자열로 저장하기

 

 

우선 여러줄의 내용이 입력된 파일을 생성해보자.

 

소스

f = open("새파일.txt", 'w')    

for i in range(1, 11):

    data = "%d번째 줄입니다.\n" % i

    f.write(data)

f.close()

 

결과

 

wirte() 함수는 내용을 다 입력하면, 다음 줄로 커서를 내려준다.

커서란 입력이 시작되는 위치, 다시 말하면 마우스를 클릭하면 세로 막대가 깜빡깜빡하는 것을 볼 수 있는데, 이것을 커서라 생각하면 된다.

따라서 for문에 의해 순차적으로 10개의 문장이 입력된 것을 알 수 있다.

 

 

1) readline() 함수로 읽기

 

f = open("새파일.txt", 'r')

line = f.readline()

print(line)

f.close()

1번째 줄입니다.

 

readline()은 파일의 내용 중 한줄 만 읽고, 커서를 다음 줄로 내려준다.

 

1269732368_1557521177.5682.png

 

따라서 readline()으로 파일의 모든 내용들을 읽으려면, 파일의 끝 줄까지 계속 읽어 내려가야한다.

 

f = open("새파일.txt", 'r')

while True:

    line = f.readline()

    if not line:

       break

    print(line, end="")

f.close()

1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다.

 

소스 설명

f = open("새파일.txt", 'r') "새파일.txt" 를 읽기 모드로 열어준다.
while True: 무한 반복
    line = f.readline() 커서가 있는 줄(처음은 첫줄)을 읽어서 line 변수에 저장한다.

    if not line:

       break

line의 내용이 없으면 while 구문을 break 한다.
    print(line, end="") line의 내용이 있다면 출력한다. 파일 내용 중에 이미 "\n"이 있으므로 end에 공백을 넣어준다.
f.close() 파일을 다 사용했으면 닫아준다.

 

 

1269732368_1557522027.6814.png

 

 

2) readlines() 함수로 읽기

 

readline과 다른 점을 보면 뒤에 s 가 붙어 있다. 복수형이라는 것을 짐작할 수 있다. 

readlines()는 파일의 내용을 순차적으로 읽어서, 각 줄을 리스트로 저장해준다.

f = open("새파일.txt", 'r')

lines = f.readlines()

print(lines)

for line in lines:

    print(line, end = "")

f.close()

['1번째 줄입니다.\n', '2번째 줄입니다.\n', '3번째 줄입니다.\n', '4번째 줄입니다.\n', '5번째 줄입니다.\n', '6번째 줄입니다.\n', '7번째 줄입니다.\n', '8번째 줄입니다.\n', '9번째 줄입니다.\n', '10번째 줄입니다.\n']
1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다.

 

소스 설명

f = open("새파일.txt", 'r')

"새파일.txt" 를 읽기 모드로 열어준다.
lines = f.readlines() readlines()로 모든 줄 읽어서, 각줄 리스트에 저장
print(lines) lines 출력

for line in lines:

    print(line, end = "")

lines의 내용을 한 줄씩 출력
f.close() 파일을 다 사용했으면 닫아준다.

 

 

1269732368_1557522193.9596.png

 

 

3) read() 함수로 읽기

 

f = open("새파일.txt", 'r')

data = f.read()

print(data)

f.close()

1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다.

 

read() 함수는 내용 전체를 하나의 문자열로 리턴한다. 예제의 결과가 한줄 씩 나타나는 이유는 이미 한 줄마다 "\n"이 들어있어서이다. 

 

 

 

 

※ 파일을 읽어들이는 방법이 readline(), readlines(), read() 등으로 다양하게 세분화되어 있으므로, 파일을 읽어들여서 어떤 용도로 사용하는 가에 따라, 다른 방법으로 파일 내용을 읽고 처리할 수 있다.

 

 

4. 파일에 새로운 내용 추가하기

 

쓰기 모드로 파일을 열면, 이미 존재하는 내용은 모두 사라지게 된다. 원래 있던 값을 유지하면서 새로운 내용을 추가하고자 할때는 파일 접근 모드를 추가 모드(a)로 사용한다.

 

파일 추가 모드로 열기

 

f = open("새파일.txt", 'a')

f.write("새로 내용을 추가합니다.\n")

for i in range(11, 20):

    data = "%d번째 줄입니다.\n" % i

    f.write(data)

f.close()

 

 

1269732368_1557521262.3661.png

 

파일 내용 결과

 

1269732368_1557521270.7634.png

 

 

 

※ 파일을 열때는 항상 파일 접근 모드를 잘 살펴보고, 파일 사용이 끝나면 반드시 파일을 닫아주도록 한다.

 

 

4. with 구문과 같이 사용하기

 

파일을 관리할때는 파일을 열고, 사용 후에는 파일을 닫아줘야 한다.

하지만 with 구문과 같이 사용하면 close() 메서드를 호출하지 않아도 with 구문이 끝나면 자동으로 파일을 닫을 수 있다.

 

with open("새파일.txt", 'r') as f:

    line = f.readline()

    print(line)

1번째 줄입니다.

댓글목록

댓글이 없습니다

게시물 검색
총 30 건 , 1 페이지
올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구
Copyright © JBMPA.com All rights reserved.
사이트 언어 선택
PC 보기