18. 파일 읽기와 쓰기

2020. 7. 8. 03:54Investment Story/금융공학 - 파이썬

반응형

파이썬을 공부하는 이유는

금융데이터를 가지고 보다 편하게

자료를 가공 및 생산하여 투자에 도움이 되게 하기 위함입니다.

그러기 위해서는 외부 파일을 읽을 수 있어야겠죠.

파일 읽는 방법에 대해 알아보는 시간을 갖겠습니다.


인코딩과 디코딩

우리가 보통 쓰는 이 한글이나 영어 등의 문자는

컴퓨터가 읽을 수 있는 언어가 아닙니다.

따라서 정해진 규칙에 따라 데이터를 이진화하여 저장하는데

이를 인코딩이라고 합니다.

인코딩 방식에 따라 같은 문자라고 하더라도 다른 이진수로 저장될 수 있겠죠.

 

우리가 잘 알고 있는 ASCII(아스키) 코드는 7개의 비트를 사용하여 128개 문자를 표현할 수 있죠.

그리고 1995년, 애플과 마이크로소프트 그리고 IBM에서 만든 컨소시엄을 만든 유니코드가

국제표준으로 지정되었습니다. 

유니코드는 16비트를 사용하여 총 65,536개의 문자를 표현할 수 있습니다.

 

파이썬 3의 문자열은 유니코드를 사용하며

온전한 한 문자를 표현하는데 4Bytes 단위를 사용합니다. 

(참고 : 1Byte = 8Bits)

 

문제는 모든 문자가 다 4 Bytes를 사용해야만 표현 가능한 게 아니란 것이죠.

어떤 문자는 1Byte, 어떤 문자는 2 Bytes만 이용하더라도 표현 가능한데,

모든 문자를 4 Bytes를 사용하여 표현한다면 메모리 효율을 낭비시키는 것이나 다름없습니다.

 

이러한 문제를 보완하기 위해 많은 인코딩 기법들이 사용되어왔으나

대중적으로 널리 쓰이는 인코딩은 UTF-8과 UTF-16이 있습니다.

그래서 모든 문자를 4 Bytes를 통해 표현하는 것이 아니라

예를 들어 UTF-8 인코딩을 사용하면 ASCII 문자들은 1Byte만 사용되어 표현 가능합니다.

 

그런데요. 

어떤 인코딩 방법으로 인코딩 된지 모르는 이진수의 경우에는

다시 문자로 해석하기가 힘들겠죠.

인코딩된 이진수를 문자로 해석하는 것을 디코딩이라고 합니다.

 

유니코드에도 인코딩하는 여러 방법이 있기에

디코딩하는 녀석에게 어떤 방식으로 했는지 알려줘야겠죠.

그것을 바이트 순서 표식(Byte Order Mark), 줄여서 BOM이라고 합니다.

이진수로 시작하는 텍스트 앞에 정보를 표시하는 것이죠.

BOM을 붙인다면 범용성이 커지겠죠?


파일 Open

파이썬에서 파일을 읽기 위하여

아래와 같은 표현을 합니다.

open(경로,파일열기모드,인코딩방법)

 

경로는 말 그대로 열 파일의 위치를 이야기합니다.

이때 경로는 상대 경로도 가능하고,

절대 경로도 가능합니다.

(상대 경로는 현재 열고 있는 파이썬 파일을 기준으로의 경로를 이야기함)

 

파일열기모드는 아래와 같습니다.

파일열기모드 설명
r 읽기 모드(Default 값)
w 쓰기 모드(기존 내용 삭제)
a 파일 마지막 내용 추가 모드

 

인코딩 방법은 아까 이야기했듯이 여러 방법이 있지만

UTF-8이 많이 사용된다고 이야기했죠.

그럼 dream.txt라는 파일을 쓰기 모드로 인코딩은 UTF-8을 사용하며 열고 싶다고 한다면

아래와 같이 치면 되겠죠.

open("dream.txt",w,encoding="UTF-8")

그리고 만약 아까 이야기했듯이 BOM을 추가하고 싶다면

UTF-8-sig 를 입력하시면 됩니다.


데이터 쓰기

파일을 열 수 있으면 그 안에 데이터를 쓸 수도 있겠죠.

데이터를 기록하는 함수는 write()입니다.

a라는 변수에 dream.txt를 쓰기 모드로 열어서 넣는 건 이제 다 하실 수 있겠죠.

a = open("dream.txt",'w',encoding="UTF-8")

이러면 되겠죠.

그리고 write함수를 이용하여 데이터를 집어넣을 수 있습니다.

그리고 write함수를 사용할 때 중요한 점은

close함수로 파일을 닫아야 기록이 완성된다는 것입니다.

예시로 확인하시죠.

위와 같이 하면, dream.txt를 열면 입력한 데이터가 기록되어 있겠죠?

생성된 텍스트 파일입니다. 

성공적으로 데이터가 기록되었네요.

 

지금까지 배운 함수를 이용하면 더욱 응용할 수 있는 것들도 많겠죠.


데이터 읽기

파일을 열어 데이터를 쓰는 것까지 배웠습니다.

이제 기존 파일에서 쓰인 데이터를 읽어오는 것을 공부할 차례인 것 같네요.

 

데이터를 읽는 함수는 여러 가지가 있습니다.

먼저 read() 입니다.

read()를 이용하면 파일 전체 데이터를 읽어옵니다.

다만 한 번 파일을 전체 다 읽고 나면,

읽은 위치가 가장 끝으로 이동하기에 

새로 read함수를 이용하면 데이터가 읽히지 않습니다. 

예시를 볼까요? 아까 입력한 dream.txt를 이용하겠습니다.

dream을 열어서 print를 해보았는데

처음 명령에선 실행한 대로 문장이 출력되었죠.

하지만 두 번째 명령에는 아무것도 출력을 하지 않습니다.

이는 한번 read함수를 쓰면 읽고 있는 현재 파일 위치가 맨 마지막으로 이동해서 그런 것인데요.

 

이럴 때 현재 위치를 알려주는 함수는 tell()입니다.

현재 위치를 호출하는 것이죠.

현재 위치는 100번째입니다.

 

다시 파일을 처음부터 읽고 싶다면 위치를 변경해야겠죠.

그때 사용하는 함수는 seek()입니다.

seek을 이용해서 위치를 처음으로 바꾼 후

다시 read함수를 사용하니 

내용이 출력이 되는 걸 확인할 수 있죠?

그 후 다시 tell을 이용해서 위치를 확인하니 아까 그 위치로 가있네요.

 

이 밖에 읽기와 관련된 함수는 아래와 같습니다.

readline() : 문장 한 줄씩 읽어오는 함수입니다.

readlines() : 문장 한 줄씩 전체 데이터를 불러와 리스트에 넣습니다.

 

역시 파일 읽기가 끝이 나면

close()함수로 파일을 닫을 수 있습니다.


데이터 추가

데이터 쓰기 모드를 시작하면

기존 파일에 있는 데이터가 지워지고,

새로 데이터를 쓰는 것이었죠.

데이터 읽기 모드는 말 그대로 기존 데이터를 읽기만 하는 것입니다.

그렇다면 기존 데이터에 덧붙일 수 있는 데이터 추가에 대해 알아보겠습니다.

 

쓰기 모드는 'w', 읽기 모드는 'r' 이었습니다.

추가 모드는 'a'입니다.

 

바로 예시를 통해 확인하시죠.

추가 모드로 dream.txt를 열어서

내용을 썼습니다.

결과는 어떨까요?

 

기존 내용에 이어 입력한 데이터가 추가되었습니다.


with문 사용

지금까지 데이터를 읽고 쓰고 추가하는 과정에서

계속 반복되던 일이 있습니다.

파일을 열기까진 했는데

작업이 끝나고 계속 그 파일을 일일이 닫아주었죠.

close() 함수를 사용해서 말이죠.

 

번거롭게 계속 그럴 필요가 없고

with를 사용하면 자동으로 작업이 끝나면 파일이 닫힙니다.

 

사용방법은 아래와 같습니다.

with open(파일경로,파일모드,인코딩) as 변수 :

      작업내용

위와 같이 하면 작업내용이 끝난 후 파일이 알아서 닫힙니다.


이상 파이썬을 이용해 파일을 열고 그 안에 있는 데이터를 읽고, 쓰고, 추가하는 것을 알아보았습니다.

읽어주셔서 감사합니다.

반응형

'Investment Story > 금융공학 - 파이썬' 카테고리의 다른 글

17. 에러와 예외처리  (1) 2020.06.27
16. 함수 그리고 모듈  (2) 2020.06.18
15. 함수 정의하기  (0) 2020.06.15
14. 집합(set) 알아보기  (0) 2020.06.13
13. 딕셔너리 알아보기  (0) 2020.06.13