SiLaure's Data

[Python] 15-2. Python 데이터 입출력(I,O) (2) 본문

Records of/Learning

[Python] 15-2. Python 데이터 입출력(I,O) (2)

data_soin 2021. 7. 23. 01:46

- File I/O

: 프로그램에서 파일을 열고 닫는 것

  • open()을 이용해서 열고 close()를 이용해서 닫는다.
  • close를 하지 않으면 jupyter가 계속해서 파일을 점유하고 있게 되어, 시스템 낭비가 일어난다.
    • with open() 을 쓰면 동시에 처리할 수 있기 때문에 편하다.
  • open() 함수는 다양한 옵션을 제공하지만 기본적으로는 txt파일을 여는 것을 기본으로 가정한다.
  • 다른 타입의 파일을 열기 위해선 다른 라이브러리들이 필요하다.
e.g. csv, excel 파일을 열기 위해 pandas, csv, openpyxl 라이브러리를 사용할 수 있다.
e.g. png, jpg 파일을 열기 위해 PIL, opencv 라이브러리를 사용할 수 있다.
e.g. pk, pkl 파일을 열기 위해 pickle 라이브러리를 사용할 수 있다.

 

 

- .txt 파일 열기 --read(), readline(), readlines(), for문을 이용한 방법

파일을 불러올 때는 경로가 굉장히 중요하다!
경로에는 두 가지 경로가 있다.
1) 절대경로 : 웬만하면 쓰지 말 것....
2) 상대경로 : Windows면 탐색기 기준, MacOS일 경우 Finder 기준

 

1. f.read()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기

# with open("상대경로", "r(read mode)" as f(무엇으로 불러올 것인지) :
# 	data = f.read()
# data


with open("../data/test.txt", 'r', encoding="utf-8") as f :
    data = f.read()
data

출력 : 

'아\n휴\n아이구\n아이쿠\n아이고\n어\n나\n우리\n저희\n따라\n의해\n을\n를\n에\n의\n가\n으로\n로\n에게\n뿐이다\n의거하여\n근거하여\n입각하여\n기준으로\n예하면\n예를 들면\n예를 들자면'

cp949 에러가 뜬 다면 r 뒤에 encoding="utf-8" 를 추가해준다. 
** 파일을 오픈할 때 항상 encoding을 붙여주는 것이 정신건강에 좋다고 한다.(ㅋㅋㅋ)
  • f.read() 함수는 txt 파일에 있는 모든 글자를 가져와서 하나의 string으로 저장한다.

 

2. f.readline() 사용

with open("../data/test.txt", 'r', encoding = "utf-8") as f :
    data = f.readline()
data

출력 : '아\n'

  • f.readline() 함수는 txt 파일에 있는 첫 번째 줄만 가져온다.

 

3. f.readlines() 사용

with open("../data/test.txt", 'r', encoding = "utf-8") as f :
    data = f.readlines()
data

출력 :

['아\n',
 '휴\n',
... 
 '예를 들자면']

  • f.readlines() 함수는 txt 파일에 있는 모든 텍스트를 한줄 단위로 끊어서 리스트에 저장해준다.

 

4. for문 사용

with open("../data/test.txt", 'r', encoding = "utf-8") as f :
    for line in f :
        print(line)

출력 : 





아이구

...

예를 들면

예를 들자면

  • 파일의 처음부터 끝까지 자동으로 한 줄씩 읽어온다.

 

 

- test.txt를 열어서 한 글자짜리를 다 지우고 다시 저장하기

: 일단 저장을 해야하니 output이 있어야 한다!

output = []
# test.txt를 read mode로 열고 할 일이 끝나면 자동으로 닫는다.
with open("../data/test.txt", 'r', encoding="utf-8") as f :
    for line in f :
        if len(line)> 1 :
            output.append(line)
output
  • 분명 한 글자 이상이라고 했는데 출력된 것을 보니 한 글자짜리가 그대로 있었다.
    e.g. 
    '아\n',
     '휴\n',
  • 이유는 ??
    => \n 도 글자로 치기 때문에 사실상 한 글자가 아닌 것
  • 해결방법은
    1) new line을 다 지우거나
    2) 두 글자 이상으로 조건문을 수정하거나
  • 1) 을 선택한다면 strip() 함수로 글자를 벗겨 버린다.
    for line in f :
        line = line.strip()
        if len(line)> 1 :
            output.append(line)

또는 바로 조건문에 걸어버리기

    for line in f :
        if len(line.strip())> 1 :
            output.append(line.strip())
  • 그러나 두 번째 코드는 strip()을 두 번 써야하기 때문에 첫 번째 코드가 더 편한 코드라고 할 수 있다.

 

2. 한 글자 이상인 텍스트만 result.txt로 output list에 있는 내용을 저장

  • read mode가 아닌 write mode를 사용해야 하므로 'r'이 아닌 'w' 사용
  • print를 standard output으로도 돌 수 있고 file output으로도 돌 수 있다.
  • file=f 를 쓰면 자동으로 텍스트로 한 줄씩 써준다.
with open("../data/result.txt", 'w', encoding='utf-8') as f :
     for line in output : 
        print(line, file=f)
for line in 다음에 f를 쓰면 안된다!!! 
(저장할 데이터를 받는 것이므로) f가 아니고 output이 for문을 돌면서 데이터를 저장, 
즉, 프로그램에 있는 데이터를 가지고 저장을 해야하기 때문에

결과 확인 : 

 

제대로 데이터가 저장됐는지 불러와서 확인하기
with open('../data/result.txt','r', encoding='utf-8') as f :
    for line in f :
        print(line)

 

(결론)

with open - for문을 사용해서 텍스트 파일을 불러오는 것이 가장 편하다.

 

 

 

- pickle 라이브러리를 통해서 파이썬 object 자체를 저장하기

 : list를 txt파일로 저장할 때마다 for문을 사용하기 보다 list 자체를 저장하고 불러오고 싶을 때 사용할 수 있다.

with open("../data/test.pk", 'wb') as f :
    pickle.dump(output, f)
Q. 데이터를 불러오는 것인데 'r'이 아니라 'wb'를 쓰는 이유?
: pickle file은 python object 자체를 저장
python object 자체를 저장하는 case는 binary file로 저장이 된다.
따라서 pickle을 사용하면 list가 binary file 형태로 저장이 되기 때문에 wb(write as binary)를 사용해야 한다.
  • dump(output, f) : output을 f에 던져라.

- 저장이 잘 되었는지 확인

with open("../data/test.pk", 'rb') as f :
    output = pickle.load(f)
    
output
pickle은 bianry 형태로, python 안에서만 읽을 수 있다.
따라서 output에 다시 저장하고 output을 불러오는 것이다.

 

Comments