본문 바로가기
python

[python]파이썬 - 파일 입출력

by skysline 2023. 1. 26.
반응형

파일 입출력

  • open 함수
    • 파일을 열수 있는 함수
    • 파일 객체를 반환
    • w: 쓰기 모드
    • a: 추가 모드
    • r: 읽기 모드
 
  • 쓰기 모드
 
 
f = open("memo.txt","w") # 해당 파일이 없을 경우 새로 생성
print(f)
f.close() # 파일을 열면 항상 닫아줘야한다.
 
<_io.TextIOWrapper name='memo.txt' mode='w' encoding='UTF-8'>
 
 
 
f = open("memo.txt","w")
for i in range(1,11):
    data = f"{i} 번째 줄\n"
    f.write(data)
f.close()
 
 
  • 쓰기 모드로 여는 순간 안에 파일 내용이 사라진다.
 
 
 
# f = open("memo.txt","w")
# f.close()
 
 
  • 추가모드
 
f = open("memo.txt","a")
data = "11 번째 줄\n"
f.write(data)
f.close()
 
 
  • 읽기 모드
 
f = open("memo.txt","r")
data = f.read() # 파일 전체의 내용을 읽어서 반환한다.
f.close()
print(data)
 
1 번째 줄
2 번째 줄
3 번째 줄
4 번째 줄
5 번째 줄
6 번째 줄
7 번째 줄
8 번째 줄
9 번째 줄
10 번째 줄
11 번째 줄

 
 
f = open("memo.txt","r")
while True:
    data = f.readline() # 한줄씩 읽는데 줄바꿈 문자도 포함된다.
    if not data:
        break
    print(data,end="")
f.close()
 
1 번째 줄
2 번째 줄
3 번째 줄
4 번째 줄
5 번째 줄
6 번째 줄
7 번째 줄
8 번째 줄
9 번째 줄
10 번째 줄
11 번째 줄
 
 
 
f = open("memo.txt","r")
data = f.readlines()
f.close()
print(data)
 
['1 번째 줄\n', '2 번째 줄\n', '3 번째 줄\n', '4 번째 줄\n', '5 번째 줄\n', '6 번째 줄\n', '7 번째 줄\n', '8 번째 줄\n', '9 번째 줄\n', '10 번째 줄\n', '11 번째 줄\n']
 
  • with 
    • 자동으로 파일을 닫아준다.
 
with open("memo.txt","r") as f: # open 함수로 인해 반환되 파일객체를 f 변수가 받아준다.
    data = f.read()
    print(data)
 
1 번째 줄
2 번째 줄
3 번째 줄
4 번째 줄
5 번째 줄
6 번째 줄
7 번째 줄
8 번째 줄
9 번째 줄
10 번째 줄
11 번째 줄

 
  • with 문은 파일을 자동으로 닫아 주기 때문에 다음 처럼 메소드를 실행시 오류가 발생한다.
 
 
 
f.read()
 
 
 
with open("memo.txt","r") as f:
    while True:
        data = f.readline()
        if not data: break
        print(data,end="")
 
1 번째 줄
2 번째 줄
3 번째 줄
4 번째 줄
5 번째 줄
6 번째 줄
7 번째 줄
8 번째 줄
9 번째 줄
10 번째 줄
11 번째 줄
 
  • for문을 이용한 방법
 
with open("memo.txt","r") as f:
    for line in f:
        print(line,end="")
 
1 번째 줄
2 번째 줄
3 번째 줄
4 번째 줄
5 번째 줄
6 번째 줄
7 번째 줄
8 번째 줄
9 번째 줄
10 번째 줄
11 번째 줄
 
 
 
with open("memo.txt","r") as f:
    for line in f:
        line = line.strip()
        print(line)
 
1 번째 줄
2 번째 줄
3 번째 줄
4 번째 줄
5 번째 줄
6 번째 줄
7 번째 줄
8 번째 줄
9 번째 줄
10 번째 줄
11 번째 줄
 
with open("memo.txt","r") as f:
    for i,line in enumerate(f,1):
        print(f"No.{i} {line}",end="")
 
No.1 1 번째 줄
No.2 2 번째 줄
No.3 3 번째 줄
No.4 4 번째 줄
No.5 5 번째 줄
No.6 6 번째 줄
No.7 7 번째 줄
No.8 8 번째 줄
No.9 9 번째 줄
No.10 10 번째 줄
No.11 11 번째 줄
 
2X1=2
...
2X9=18
...
...
...
9X1=9
...
9X9=81
 
 
with open("구구단.txt","w") as f:
    for n in range(2,10):
        for i in range(1,10):
            f.write(f"{n}X{i}={n*i}\n")
 
 
구구단.txt 파일을 읽어서 구구단의 결과값들만 정수형태로 변경해서 리스트에 담으세요.
 
 
 
with open("구구단.txt","r") as f:
    lst = [ int(line.strip().split("=")[1]) for line in f]
lst
 
[2,
 4,
 6,
 8,
 10,
 12,
 14,
 16,
 18,
 3,
 6,
 9,
 12,
 15,
 18,
 21,
 24,
 27,
 4,
 8,
 12,
 16,
 20,
 24,
 28,
 32,
 36,
 5,
 10,
 15,
 20,
 25,
 30,
 35,
 40,
 45,
 6,
 12,
 18,
 24,
 30,
 36,
 42,
 48,
 54,
 7,
 14,
 21,
 28,
 35,
 42,
 49,
 56,
 63,
 8,
 16,
 24,
 32,
 40,
 48,
 56,
 64,
 72,
 9,
 18,
 27,
 36,
 45,
 54,
 63,
 72,
 81]
 

구글드라이브 연결해서 파일 가져오기

  • 마운트(mount)란?
    • 리눅스 환경에서 하드디스크나 usb 메모리 같은 물리적인 장치를 사용하기 위해 리눅스 환경에서 지정한 디렉토리에 연결해주는 과정을 말한다.
 
 
 
!uname
 
Linux
 
 
 
!cat /etc/issue
 
Ubuntu 18.04.6 LTS \n \l

 
 
 
!pwd
 
/content
 
 
 
from google.colab import drive
drive.mount("/content/drive")
 
Mounted at /content/drive
 
 
 
DATA_PATH = "/content/drive/MyDrive/01-python/data/"
DATA_PATH
 
 
 
 
 
with open(f"{DATA_PATH}memo.txt" , "r") as f:
    data = f.readlines()
    print(data)
 
['1 번째 줄\n', '2 번째 줄\n', '3 번째 줄\n', '4 번째 줄\n', '5 번째 줄\n', '6 번째 줄\n', '7 번째 줄\n', '8 번째 줄\n', '9 번째 줄\n', '10 번째 줄\n', '11 번째 줄\n']
 

JSON 파일 입출력

  • 자바스크립트에서 사용되는 객체 표현식
  • 데이터를 저장하거나 전송할때 많이 사용
  • 서버와 클라이언트간의 데이터 전송과정에서 많이 사용
  • 파이썬의 딕셔너리와 매우 유사
 
 
import json
 
 
 
DATA_PATH
 
 
with open(f"{DATA_PATH}info.json","r") as f:
    data = json.load(f) # json 파일을 딕셔너리 형태로 변환해서 반환
type(data)
 
dict
 

 

data
 
{'Daniel': {'age': 20, 'height': 170},
 'John': {'age': 20, 'height': 175, 'weight': 80}}
 
 
 
data["승천"] = {"age":31}
data
 
{'Daniel': {'age': 20, 'height': 170},
 'John': {'age': 20, 'height': 175, 'weight': 80},
 '관수': {'age': 42}}
 
 
 
with open("info.json","w") as f:
    # 한글포함시: ensure_ascii = False
    # 들여쓰기: indent = 4 or 2
    json.dump(data,f,ensure_ascii=False,indent= 4)
 
 

YAML(Yet Another Markup Language)

  • 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식
  • 데이터를 저장하거나 전송할때 많이 사용
 
 
import yaml
 
data
 
{'Daniel': {'age': 20, 'height': 170},
 'John': {'age': 20, 'height': 175, 'weight': 80},
 '관수': {'age': 42}}
 
with open("data.yml","w") as f:
    yaml.dump(data,f,default_flow_style=False,indent =4 , allow_unicode=True)
with open("data.yml","r") as f:
    data1 = yaml.load(f)
type(data1)
 
dict
 
data1
 
{'Daniel': {'age': 20, 'height': 170},
 'John': {'age': 20, 'height': 175, 'weight': 80},
 '관수': {'age': 42}}
data1["리스트"] = [True,False,"문자열",3.14]
with open("data1.yml","w") as f:
    yaml.dump(data1,f,default_flow_style=False,indent=4,allow_unicode=True)
with open("data1.yml" , "r") as f:
    data1 = yaml.load(f)
data1
 
{'Daniel': {'age': 20, 'height': 170},
 'John': {'age': 20, 'height': 175, 'weight': 80},
 '관수': {'age': 42},
 '리스트': [True, False, '문자열', 3.14]}
 

pickle 모듈

  • 우리가 사용하는 다양한 객체들을 파일로 저장하고 싶다면?
  • 객체의 구조를 직렬화해서 파일로 저장한다.
 
 
import pickle
 
 
data = [1,2,3,4,[10,20],"hi"]
 
 
with open("data.pkl","wb") as f:
    pickle.dump(data,f)
 
with open("data.pkl","rb") as f:
    rdata = pickle.load(f)
rdata

[1, 2, 3, 4, [10, 20], 'hi']
 
  • 클래스와 인스턴스도 저장되는지 해보자
class MyClass:
    def __init__(self):
        self.my_name="My Class"

with open("myclass.pkl","wb") as f:
    pickle.dump(MyClass,f)

with open("myclass.pkl","rb") as f:
    class_ = pickle.load(f)
class_

__main__.MyClass
반응형

댓글