파이썬에서는 사용자로부터 값을 입력받거나, 화면상에 값을 출력하는 방법만 있는 것이 아니라 파일을 통해 입력을 받거나 출력을 할 수도 있다.
이번 포스팅에서는 파이썬의 내장 함수 open을 통해 파일을 읽고 쓰는 방법을 알아보자.
쓰기 모드로 파일 열기 - open, write, close
파일 생성하기
파일을 쓰기 전에 파일을 생성하는 방법을 알아보자.
파이썬의 내장 함수 open을 사용하면 굉장히 쉽게 파일을 생성할 수 있다.
open 함수는 파일 객체 = open("파일이름.확장자", "읽기 모드")의 형태로 사용하면 된다.
다음 코드를 실행하여 파일을 생성해보자.
f = open("new_file.txt", mode="w")
f.close()
읽기 모드에 "w"를 입력하면 파일 쓰기모드가 되면서 파일이 새로 생성이 된다.
mode 파라미터는 생략할 수 있는데 앞으로는 mode 파라미터는 생략하고 사용하겠다.
위 코드를 실행하면 현재 실행되는 파이썬 파일이 있는 폴더를 열어보면 new_file.txt가 만들어진다.
여기서 파일 이름은 문자열 형식이며 끝에 확장자를 적어줘야 한다.
쓰기 모드에서는 기존에 같은 이름의 파일이 이미 존재하고 있었다면 기존 파일의 내용은 사라지니 주의하도록 하자.
열었던 파일은 다시 닫아줘야 저장이 되는데 만약 닫지 않은 파일을 다시 불러올 때 에러가 발생하니 꼭 닫아주도록 하자.
close()를 통해 파일을 닫을 수 있다. 파일을 닫아야 저장이 된다.
지정된 위치에 파일 쓰기
내가 원하는 위치에 파일을 생성할 수도 있다.
f = open("C:/Users/COKID/Desktop/new_file.txt", "w")
f.close()
다음과 같이 파일명에 경로를 함께 적어주면 원하는 위치에 파일을 생성할 수 있다.
경로를 적을 때 슬래쉬(/)를 쓰지 않고 역슬래쉬(\)를 쓰는 경우도 있는데, 작성 방법이 좀 다르다.
f1 = open("C:\\Users\\COKID\\Desktop\\new_file_1.txt", "w")
f1.close()
f2 = open(r"C:\Users\COKID\Desktop\new_file_2.txt", "w")
f2.close()
문자열에 역슬래쉬는 문자열의 이스케이프로 사용될 수가 있어 역슬래쉬를 쓰려면 역슬래쉬 앞에 하나를 더 붙여 두 개로 써야 한다. 만약 역슬래쉬를 하나만 사용하고 싶다면 파일 경로 앞에 r문자를 붙이면 그대로 사용할 수 있다.
파일을 불러와서 내용 쓰기
이번엔 write 함수를 통해 불러온 파일에 내용을 적어보자. 아래 코드를 실행해보자.
f = open("new_file.txt", "w")
for i in range(1, 11):
writing = "{}번째 줄 작성\n".format(i)
f.write(writing)
f.close()
코드를 실행하고 new_file을 열어보면 내용이 적힌 것을 볼 수 있다. 내용 입력이 끝났응면 파일을 꼭 닫아주자.
읽기 모드로 파일 열기 - open, readline, readlines, read
파일 불러오기
이번에는 이미 작성된 파일을 불러와보자. 마찬가지로 open 함수를 사용하고 읽기모드에 "r"을 적어주기만 하면 된다.
f = open("new_file.txt", "r")
f.close()
파일을 열면 반드시 마지막에 다시 닫아주는 것을 잊지 말자.
당연한 얘기지만 쓰기 모드에서 동일한 이름의 파일이 기존에 없는 경우에는 새로 파일을 만들었던 것과 달리 읽기 모드에선 불러오려는 파일이 존재하지 않을 경우 오류가 발생한다.
지정된 위치의 파일 읽기
f = open("C:\\Users\\NEOCHOE\\Desktop\\new_file.txt", "r")
f.close()
파일 경로를 따로 지정해주지 않으면 현재 실행되는 파이썬 파일과 같은 위치에 있는 파일만 불러올 수 있다.이렇게 경로를 지정해줘야 다른 경로에 있는 파일을 읽어올 수 있다.
파일의 내용 확인하기 - readline으로 한 줄만 불러오기
leadline 함수를 사용하면 파일의 내용 중 한 줄만 불러올 수 있다.
다음 코드를 실행하여 위에서 만든 new_file.txt의 내용을 불러와보자.
f = open("new_file.txt", "r")
reading = f.readline()
print(reading)
f.close()
#결과 출력
1번째 줄 작성
첫 번째 줄만 출력이 된다. 다음 코드도 실행해보자.
f = open("new_file.txt", "r")
reading = f.readline()
print(reading)
reading = f.readline()
print(reading)
f.close()
#결과 출력
1번째 줄 작성
2번째 줄 작성
첫번 째 줄과 두 번째 줄이 출력된다. readline 함수는 한 줄만 불러올 수 있지만, 이전에 불러왔던 위치를 기억하여 파일을 다시 닫았다가 다시 열지 않았다면 이전에 마지막으로 불러왔던 줄의 다음 줄을 불러온다.
현재 파일을 읽어오는 위치를 확인하려면 tell함수를 사용할 수 있고 원하는 위치로 이동하려면 seek 함수를 사용한다.
f = open("new_file.txt", "r")
reading = f.readline()
print(reading)
print("현재위치: {}:".format(f.tell())) # 현재 위치 출력
f.seek(0) # 원하는 위치로 이동
reading = f.readline()
print(reading)
f.close()
결과 출력
1번째 줄 작성
현재위치: 15:
1번째 줄 작성
위 코드를 보면 첫 한 줄을 출력한 후 tell함수로 현재 위치를 출력하고 seek 함수로 0번째 위치로 돌아가 다시 한 줄을 출력했다.
원하는 만큼만 파일 읽기
readline()의 괄호 안에 숫자를 넣으면 그 숫자만큼의 내용만 가져온다. 아래 코드를 실행하고 결과를 확인해보자.
f = open("new_file.txt", "r")
reading = f.readline(4)
print(reading)
reading = f.readline(10)
print(reading)
reading = f.readline(500)
print(reading)
f.close()
#결과 출력
1번째
줄 작성
2번째 줄 작성
f.readline(4)는 "1번째 " 공백까지 네 글자를 읽어온다. readline은 이전에 읽었던 위치부터 다시 읽으니까 그다음 readline(10)은 공백부터 다음 열 글자를 읽어야 하지만, readline() 한 줄만 읽기 때문에 그 줄의 남은 문자만을 읽어온다.
그리고 그 다음 코드도 마찬가지로 500글자를 읽어와야 하는데, 그 줄에 8개의 글자밖에 없기 때문에 8개만 읽어온다.
파일의 모든 내용 가져오기 - while문 & readline 함수
파일의 모든 내용을 가져오려면 반복문을 사용하면 된다. While문에서 readline을 사용하여 더 이상 불러 올 내용이 없을 때 반복문을 탈출하는 코드를 짜 보자.
f = open("new_file.txt", "r")
while True:
reading = f.readline()
if not reading:
break
print(reading)
f.close()
#결과 출력
1번째 줄 작성
2번째 줄 작성
3번째 줄 작성
4번째 줄 작성
5번째 줄 작성
6번째 줄 작성
7번째 줄 작성
8번째 줄 작성
9번째 줄 작성
10번째 줄 작성
파일 내용 확인하기2 - readlines 함수
readline 함수에 s를 하나 더 붙은 readlines 함수도 있다. readline 함수가 한 줄씩 가져왔던 것과 달리 readlines 함수는 모든 내용을 가져올 수 있다. 다음 코드를 실행해보자.
f = open("new_file.txt", "r")
reading = f.readlines()
print(reading)
f.close()
#결과 출력
['1번째 줄 작성\n', '2번째 줄 작성\n', '3번째 줄 작성\n', '4번째 줄 작성\n', '5번째 줄 작성\n', '6번째 줄 작성\n', '7번째 줄 작성\n', '8번째 줄 작성\n', '9번째 줄 작성\n', '10번째 줄 작성\n']
readlines 함수를 사용하니 모든 내용을 가져오긴 하지만 각 줄을 요소로 가진 리스트 형태로 출력이 된다.
readlines도 역시 이전에 마지막으로 읽었던 위치부터 파일을 읽기 시작한다.
f = open("new_file.txt", "r")
print(f.readline())
print(f.readlines())
f.close()
1번째 줄 작성
['2번째 줄 작성\n', '3번째 줄 작성\n', '4번째 줄 작성\n', '5번째 줄 작성\n', '6번째 줄 작성\n', '7번째 줄 작성\n', '8번째 줄 작성\n', '9번째 줄 작성\n', '10번째 줄 작성\n']
readline 함수로 첫 번째 줄을 읽은 후 readlines 함수를 쓰니 2번째 줄부터 읽어온다.
readlines함수로 읽어온 내용을 readline 함수처럼 문자열로 한 줄씩 보려면 가공이 조금 필요한데, readlines는 결과물을 리스트 형태로 반환한다. 리스트 자료형과 잘 울리는 for 반복문을 이용해보자.
f = open("new_file.txt", "r")
reading = f.readlines()
for i in reading:
print(i)
f.close()
1번째 줄 작성
2번째 줄 작성
3번째 줄 작성
…(생략)
readlines 함수와 for반복문으로 readline처럼 한 줄씩 출력했지만 각 줄의 끝에 있는 줄 바꿈 이스케이프 코드인 \n 때문에 출력값에 줄 바꿈이 되어있다. strip 함수로 한 줄씩 깔끔하게 출력해보자.
f = open("new_file.txt", "r")
reading = f.readlines()
for i in reading:
print(i.strip())
f.close()
#결과 출력
1번째 줄 작성
2번째 줄 작성
3번째 줄 작성
…(생략)
리스트의 요소들을 문자열 형태로 합쳐주는 join 함수도 방법이 될 수 있다.
f = open("new_file.txt", "r")
reading = f.readlines()
print(''.join(reading))
f.close()
#결과 출력
1번째 줄 작성
2번째 줄 작성
3번째 줄 작성
…(생략)
일부 내용만 가져오기
readline()의 괄호에 숫자를 넣어서 일부 내용만 가져왔던 것처럼 readlines도 비슷하게 사용할 수 있다.
f = open("new_file.txt", "r")
reading = f.readlines(4)
print(reading)
reading = f.readlines(10)
print(reading)
reading = f.readlines(500)
print(reading)
f.close()
#결과 확인
['1번째 줄 작성\n']
['2번째 줄 작성\n', '3번째 줄 작성\n'] ['4번째 줄 작성\n', '5번째 줄 작성\n', '6번째 줄 작성\n', '7번째 줄 작성\n', '8번째 줄 작성\n', '9번째 줄 작성\n', '10번째 줄 작성\n']
현재 파일의 한 줄은 위와 같이 8개의 글자로 이루어져 있다. readlines(4)의 결과를 보면 4글자를 읽어오라고 했지만, 첫 번째 줄의 모든 문자를 읽어온다. 그다음 줄에는 10글자를 읽어오랬더니 3번째 줄까지 읽어왔다. readlines()의 괄호에 숫자를 넣으면 내용을 불러올 수 있는 단위가 최소 한 줄이 되는 것이다. 만약 숫자가 범위를 초과하면 readline에서 현재 파일을 읽는 위치의 줄만 읽어오는 것이 아닌 readlines는 모든 글자를 다 읽어와서 리스트 형태로 저장한다.
파일 내용 확인하기3 - read 함수
파일의 모든 내용을 가져오는 더 쉬운 방법이 있다. 바로 read 함수를 사용하는 것이다.
f = open("new_file.txt", "r")
reading = f.read()
print(reading)
f.close()
#결과 출력
1번째 줄 작성
2번째 줄 작성
3번째 줄 작성
…(생략)
일부 내용만 가져오기
read 함수에서 일부 내용만 가져오는 방법은 굉장히 직관적이다. 예문으로 확인하자.
f = open("new_file.txt", "r")
reading = f.read(2)
print(reading)
f.seek(0)
reading = f.read(3)
f.seek(0)
print(reading)
reading = f.read(8)
f.seek(0)
print(reading)
f.close()
#결과 출력
1번
1번째
1번째 줄 작성
read()의 괄호 안에 숫자를 넣으면 글자 수만큼 내용을 읽어온다. 직관적으로 사용하면 될 것 같다.
추가 모드로 파일 열기
파일 읽기 모드 'w'를 사용했을 때 기존에 동일한 파일명의 파일 내용이 사라지고 새로운 내용이 덮어 써진다. 기존 파일에 새로운 내용을 추가하려면 추가 모드 'a'를 사용해야 한다.
앞서 만들었던 new_file에 새로운 내용을 작성해보자.
f = open("new_file.txt", "a")
print('*' * 20)
for i in range(11,21):
writing = "{}번째 줄 작성\n".format(i)
f.write(writing)
f.close()
파일을 열어보면 11번째부터 20번째 줄까지 새로 내용이 추가되었다.
with문으로 파일 열기
어떤 모드로 파일을 읽건 한 번 열었던 파일은 반드시 close로 닫으라고 강조해왔는데, 매번 열었던 파일을 다시 닫는 건 번거롭고 깜빡할 수도 있다. 이런 번거로움을 덜기 위해 존재하는 것이 with문이다.
파일을 with문으로 열면 따로 파일을 닫는 작업을 해주지 않아도 된다.
with문은 with open("파일명", "열기 모드") as 파일 객체: 형태로 사용한다. 예문을 보며 익혀보자,
with open("new_file.txt", 'r') as f:
reading = f.readline()
이렇게 with와 as로 파일을 열면 as 뒤의 객체 f에 파일이 저장된다. 이렇게 with로 파일을 열게 되면 with문을 벗어나면 자동으로 파일이 닫히지 때문에 따로 close를 안 해줘도 된다. 그러니 가급적이면 with를 사용하는 것이 좋을 것 같다.
with문으로 파일을 여러개 동시에 여는 것도 가능하다.
with open("new_file.txt", 'r') as f, open("new_file2.txt", 'w') as f2:
reading = f.read()
writing = f2.write(reading)
위와 같이 콤마(,)를 사용하여 여러개의 파일을 동시에 열 수 있다. 위 코드는 new_file.txt의 내용을 읽고 "줄"을 "라인으로 바꿔 new_file2.txt에 쓰는 코드인데, with문으로 매우 간결하게 구현할 수 있다.
'파이썬 > 기초 문법' 카테고리의 다른 글
[파이썬]모듈 - 만들기, 불러오기, if __name__ == "__main__" (0) | 2022.10.14 |
---|---|
[파이썬]클래스(class) - 구조, 객체, 생성자, 상속, 오버라이딩 (0) | 2022.10.13 |
[파이썬]함수 - 매개변수 지정호출, args, kwargs, 초기값 설정, 전역 변수 (0) | 2022.10.12 |
[파이썬]함수 이해하기 - 함수의 기본 구조와 특성 (0) | 2022.10.08 |
[파이썬]사용자 입력과 출력 - input, print (1) | 2022.10.07 |
댓글