<개인공부>/[Python]

[python] 파이썬 파일읽기, 파일쓰기 (open , close, write, read, tell, seek)

BlockDMask 2020. 12. 23. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 파이썬에서 파일을 생성하고 읽고 쓰는 파일 입출력을 한번 다뤄볼까 합니다.
여기서 다룰 파일 관련 함수는 open, close, write, writeline, writelines, read, readline, readlines, seek, tell 함수 입니다.

<목차>
1. 파일 생성 open, close 함수
2. 파일 쓰기 write, writeline, writelines 함수
3. 파일 읽기 read, readline, readlines, seek, tell 함수


1. 파이썬 파일 생성 open, close 함수


파이썬에서 파일을 생성할때에 사용하는 함수는 open() 함수 입니다.
open 함수는 파이썬 기본 내장함수 입니다.
이 함수이름은 open이지만 옵션에 따라서 파일을 생성 하고 열기 인 경우, 읽기만을 위한 열기, 쓰기위한 열기 등 여러 옵션들이 있습니다.

1-1) open() 함수 기본 모양

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): 

정의를 보면 이렇게 복잡하게 되어있지만 우리는 앞에 두가지만 알아보려 합니다. 마지 open 함수의 모양이 원래 아래와 같다고 생각해도 무방합니다. 뒤에있는 인자들은 저희같은 초보는 아직 몰라도 될것 같습니다.
def open(filemode='r'):

open 함수는 파일을 열고 해당 파일에 대한 스트림을 반환합니다.
파일 열기를 실패했을때는 Error를 발생시킵니다.

인자를 보면

첫번째 인자 file
- 파일 경로를 집어 넣습니다.

두번째 인자 mode
- 파일이 열리는 옵션, 모드 입니다. 이 모드에 따라 읽기 용인지 파일을 생성하고 쓸것인지 등이 정해집니다.
- 'r' : 기본값으로 정해져 있으며 파일을 읽기 위한 옵션 입니다.
- 'w' : 쓰기모드이며 파일에 내용을 쓸 때 사용하는 옵션 입니다. 만약 이미 파일이 존재하면 커서를 맨 앞으로 돌리면서 뒤에 내용을 다 잘라내기 때문에 내용이 사라질 수 있습니다. 파일이 존재하지 않는다면 새롭게 파일을 생성합니다.
- 'a' : 쓰기모드이며 파일에 내용을 쓸 때 사용하는 옵션입니다. w 옵션과는 달리 이미 파일이 존재하면 그 파일의 끝에 커서가 존재하고, 그 뒤에 이어쓰기가 가능합니다.
즉, 파일 내용을 잘라내지 않고 이어서 쓸 수 있습니다.
- 'x' : 파일이 없으면 파일을 생성하고 쓰기모드로 열립니다. 만약 파일이 있으면 에러를 발생시킵니다.

- 'b' : 바이너리 모드 입니다.
- 't' : 텍스트 모드 입니다. (기본값)

두번째 인자는 'r', 'w', 'a', 'x' 와 같이 't'나 'b'를 따로 쓰지 않으면 기본적으로 텍스트 모드인 't'로 열리게 됩니다. 즉, 읽기위해 'r'을 넣는다는것은 'rt'를 넣는것과 동일한 뜻 입니다.
만약 파일을 읽기모드인데 바이너리 모드로 열고싶다면 'rb' 이런식으로 집어 넣으면 됩니다.
따로 표기 하지않으면 기본적으로 텍스트 모드인 't'로 열립니다.

오픈한 파일을 닫으려면 파일 닫기 함수인 close()함수를 이용해야합니다.

1-2) open() 함수 예제

1
2
3
4
5
6
7
8
9
10
# 파일 열기
= open('C:/Test/t1.txt''w')
 
# 파일에 텍스트 쓰기
f.write('blockdmask blog')
f.write('\npython open func')
 
# 파일 닫기
f.close()
 
cs

open('경로/파일이름', '모드') 함수를 이용해서 'w'모드로 열게되면 파일이 존재하지 않기 때문에 해당 경로에 't1.txt'라는 파일이 생성된 후에 변수 f에 파일 스트림이 들어오게 됩니다.

해당 파일 스트림을 이용해서 우리는 파일에 내용을 쓰고, 읽고 할 수 있습니다.
예제에서는 write(' ') 함수를 통해서 파일에 문자열을 집어 넣어주었습니다.
파일을 뜯고 씹고 맛본 다음에는 파일을 얌전히 닫아줍니다. 이때 사용하는 함수는 close() 함수 입니다.

결과를 보면 t1.txt라는 파일이 생성되고 그 안에 문자열이 잘 들어가있는걸 볼 수 있습니다.


**주의
파일 객체는 반드시 열었으면(open) 닫아야(close)합니다.
오픈한 파일을 닫지 않는다면 데이터가 날라갈 수 있습니다. 


2. 파이썬 파일 쓰기 write, writelines 함수


파일을 열었으면 파일 스트림을 이용해서 파일에 텍스트를 쓸 수 있습니다.
그 때 사용하는 함수가 write 함수, writelines 함수 입니다.

2-1) 파이썬 write 함수

IO.write("문자열")

write 함수는 매개변수로 파일에 넣을 문자열을 받습니다.

1
2
3
4
5
6
7
8
9
10
# 파일 w 모드로 열기 (파일 새로 만듦)
= open('C:/Test/t2.txt''w')
 
# write 함수를 이용해서 파일에 텍스트 쓰기
f.write('write write write\n')
f.write('파이썬 파일 입출력 포스팅\n')
 
# 파일 닫기
f.close()
 
cs

f = open('파일경로/파일이름', 'w')
- 해당 코드를 실행하면 t2.txt 파일이 생성됩니다. w모드로 열었기 때문에 파일이 있으면 덮어씌워지고 내용은 싹 지워집니다. 파일이 없으면 파일이 생성됩니다.

f.write('')
- 파일을 열고 파일스트림을 이용해서 write 함수를 호출 했습니다.
내용을 보시면 개행문자(\n)을 직접 입력해준걸 볼 수 있습니다. 이렇게 개행이나 탭 등은 우리가 직접 입력을 해주어야합니다.

f.close()
- 파일을 열었으면 꼭 닫아야죠

결과를 보면 파일에 우리가 입력한 내용이 잘 들어가있는걸 볼 수 있습니다.


2-2) 파이썬 writelines 함수

IO.writelines(List["문자열1", "문자열2", ... ])

write 함수는 매개변수로 파일에 넣을 문자열 리스트를 받습니다.

아까 생성했던 t2.txt에 이어서 파일에 문자열을 집어 넣어보겠습니다. 이미 있는 파일이고 해당 파일에 이어서 써야하니 'a'모드로 열어야겠죠?

1
2
3
4
5
6
7
8
9
10
11
12
# 파일 a 모드로 열기 (이미 있는 파일에 이어서 쓰기)
= open('C:/Test/t2.txt''a')
 
# writelines 함수를 이용해서 파일에 문자열들 쓰기
f.writelines(['a''b''123''456''abcdefg''\n'])
 
# writelines 함수에 join 을 이용해서 문자열들에 자동 개행 넣기
f.writelines('\n'.join(['BlockDMask''python''blog']))
 
# 파일 닫기
f.close()
 
cs

f = open('파일경로/파일이름', 'a')
- 'a' 모드로 파일을 열었기 때문에 파일이 있으면 해당 파일의 맨 끝으로 가서 이어서 쓸 수 있습니다. 파일이 없으면 파일이 생성됩니다.

f.writelines(list[문자열1, 문자열2, ...]
- 파일을 열고 파일스트림을 이용해서 writelines 함수를 호출 했습니다.
내용을 보시면 이번에도 문자열 리스트의 맨 끝에 개행문자(\n)을 직접 입력해준걸 볼 수 있습니다.
그럼 우리는 join 함수를 이용해서 개행을 문자열 리스트 사이사이에 넣어주는 걸 응용할 수 있습니다. '\n'.join([ 문자열 리스트 ]) 이런식으로 하면 위 결과창과 같이 사이사이 개행이 잘 들어가 있는걸 볼 수 있습니다.

f.close() 
- 파일을 열었으면 꼭꼭 닫아야죠22


3. 파이썬 파일 읽기 read, readline, readlines, seek, tell 함수


파일을 읽는 함수 read, readline, readlines 세가지와 파일 위치 관련함수 seek, tell 함수 이렇게 한번 알아보겠습니다.

3-1) read, readline, readlines함수 설명

IO.read(n)

read(n) 함수는 파일 스트림으로 부터 해당 위치의 문자 n개를 읽어오는 함수 입니다. n바이트를 읽어오는 것 입니다. read() 이렇게 아무것도 넣지 않으면 모든 문자를 읽어오게 됩니다.
반환 : 문자N개를 반환합니다.

IO.readline()

readline() 함수는 함수 이름에서 알 수 있듯이 파일 스트림으로 부터 해당 위치에서부터 한 줄, 한 라인의 문자열을 읽어옵니다. 즉 '\n' 개행이 있을때 까지 문자열을 읽어옵니다.
반환 : 문자열을 반환합니다.

IO.readlines()

readlines() 함수는 해당 위치에서부터 파일의 모든 문자열을 읽어옵니다. (개행 포함)
반환 : List[문자열]을 반환합니다. 리스트로 반환됩니다.


3-2) seek, tell 함수 설명

우리가 워드나 메모장 하다못해 어딘가에 글을 쓸때 항상 세로줄로 | 깜빡깜빡 하는 커서가 있을것 입니다. 이것은 현재 글을 쓸 위치를 알려주는것인데, 이것을 기준으로 글이 써지게 됩니다.

파이썬에서 파일을 다룰때에도 이러한 커서의 위치에 따라서 그 위치에 문자를 쓰고, 그 위치에서 문자를 읽어오게 됩니다. seek, tell 함수는 이 커서의 위치를 이동하고, 커서의 현재 위치를 가지고 오는 함수 입니다.

IO.seek(위치)

seek 함수는 해당 위치로 파일의 커서를 옮깁니다. 파일의 맨 처음 위치는 0 입니다.

IO.tell()

tell 함수는 현재 커서의 위치를 반환하는 함수입니다.


3-3) 파일 읽기 함수 예제

우선 txt파일을 준비해줍니다. 파일 쓰기 예제에서 사용했던 t2.txt을 읽어오겠습니다.
현재 t2.txt 파일은 이러한 상태입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 파일 r 모드로 열기
= open('C:/Test/t2.txt''r')
 
# read() 함수 이용해서 하나씩 읽어오기
print('\n1. read()')
print(f'위치 : {f.tell()}')
 
s1 = f.read(1)
print(s1)
 
# readline() 함수 이용해서 한 라인씩 읽어오기
print('\n2. readline()')
print(f'위치 : {f.tell()}')
 
s2 = f.readline()
print(s2)
 
# readlines() 함수 이용해서 모두 읽어오기
print('\n3. readlines()')
print(f'위치 : {f.tell()}')
 
s3 = f.readlines()
print(s3)
 
# 맨 처음 위치로 가서 한줄 읽기
print('\n4. seek(0), readline()')
 
f.seek(0)
print(f'위치 : {f.tell()}')
 
s4 = f.readline()
print(s4)
 
 
# 파일 닫기
f.close()
 
cs

1. read()를 보면 파일 커서(=파일포인터)의 위치가 0에서 read()를 한번 호출하니 파일로 부터 "w"를 읽어와서 반환 하는 것을 볼 수있습니다.

2. readline()을 보면 앞서 사용했던 read() 함수에 의해서 파일 커서의 위치가 1로 변경된걸 알 수 있습니다. 그 상태에서 readline() 함수를 이용하니
"write write write" 문자열에서 1개 이동한 위치에서 읽어오기 때문에 "rite write write" 를 읽어온걸 알 수 있습니다.

3. realines() 를 보면 앞서 사용했던 realine 때문에 파일 커서의 위치가 바뀐걸 볼 수 있습니다. 그 상태에서 파일의 끝까지 문자들을 읽어오고, 개행까지 포함해서 리스트로 변경해주는걸 볼 수 있습니다.

4. seek(0) 함수를 이용해서 파일 커서의 위치를 맨 앞으로 옮기고 readline() 함수를 이용해서 한 라인의 문자열을 읽어 들였습니다. "write write write" 문자열을 읽어온것을 확인 할 수 있습니다.


이상으로 파이썬에서 파일을 생성하고, 파일 내용을 읽고 쓰는 함수들에 대해서 알아보았습니다. 감사합니다.

반응형