SiLaure's Data
[Python] 15-2. Python 데이터 입출력(I,O) (2) 본문
- 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을 불러오는 것이다.
'Records of > Learning' 카테고리의 다른 글
[Numpy] 02. Array 만들어보기 (0) | 2021.07.23 |
---|---|
[Numpy] 01. Numpy란? (0) | 2021.07.23 |
[Python] 15-. Python 데이터 입출력(I,O) (1) (0) | 2021.07.22 |
[Python] 14-1. Python 기초 문법 - Function 2(Implementation) (1) (0) | 2021.07.22 |
[Python] 13. Python 기초 문법 - Function 1 (Definition) (0) | 2021.07.22 |
Comments