[python] 입출력

728x90

1. input 함수

파이썬에서 input은 사용자 입력값을 받는 함수입니다. 즉 동적으로 입력을 받는 것입니다. 이 함수를 사용하면 콘솔등에서 입력을 받아 데이터를 유연하게 처리할 수 있습니다. 

name = input("이름을 입력해주세요 : ") #입력: kim
age = input("나이를 입력해주세요 : ") #입력: 30 #기본타입은 문자열로 받는다.
age2 = int(input("나이를 입력해주세요 : ")) #입력: 30 -> 타입에 따른 형변환이 필요
print(type(name),type(age),type(age2)) #출력: <class 'str'> <class 'str'> <class 'int'>
print(f"name: {name}. age: {age}, age2: {age2}") #출력:name: kim. age: 30, age2: 30

print("문자열: {}".format(input("문자열을 입력해주세요: "))) #입력 aaa -> 출력:문자열: aaa ->fstring방법으로는 불가

# 오타방지를 위해 예외처리 추가

try:
    n1 = int(input("숫자를 입력해주세요: "))
    print(f"입력한 숫자는 {n1}입니다.")
except ValueError:
    print("숫자가 아닙니다.")


#올바른 값 입력 완료까지 지속
while True:
    try:
        n2 = int(input("숫자를 입력해주세요"))
        break
    except ValueError:
        print("숫자가 아닙니다.")

print(f"입력한 숫자는 {n2} 입니다.")

 

2. 파일입출력

파이썬에서 파일입출력 방법에는 여러가지가 있습니다. 

1) with문

파이썬에서 with 문은 자원을 사용하는 동안에 해당 자원을 안전하게 열고 닫을 수 있도록 도와주는 문법적 구조입니다. with 문은 "컨텍스트 관리자"를 사용하여 작동하며, 파일 입출력, 네트워크 연결, 데이터베이스 연결 등과 같이 자원을 사용하는 경우에 유용하게 사용됩니다.

with 문을 사용하면 파일을 열거나 자원을 할당한 뒤에는 자동으로 자원을 닫아주는 작업을 해줍니다. 이렇게 하면 프로그래머가 명시적으로 자원을 해제하는 코드를 작성하지 않아도 되므로 코드가 간결하고 오류를 방지하는 데 도움이 됩니다.

 

일반적으로 with 문은 다음과 같이 사용합니다

with 컨텍스트_관리자 as 변수:
    # 자원 사용 코드

컨텍스트_관리자는 해당 자원의 컨텍스트 관리자를 나타내는 객체이고, as 변수는 해당 자원을 사용할 때 사용할 변수를 지정하는 부분입니다. with 블록 안에서는 변수를 사용하여 해당 자원에 접근할 수 있습니다.

 

2) 읽기

읽기모드에는 기본속성인 r과 보조 속성인 t,b등이 있습니다. 기본 값은 t(텍스트) 모드이며 r이라고 되어있는 것은 rt와 동일합니다. b는 바이너리 속성을 의미하며 모드에 rb를 입력한다면 바이너리 타입으로 읽습니다.

 

 

# 상대경로 ('../','./','/') 경로가 없다면 같은 폴더에 생성

# 텍스트 파일의 내용
test_text = """
이것은 파일 입출력 테스트 파일입니다.
2번째 줄입니다. 222222222222222222222222
3번째 줄입니다. 333333333333333333
4번째 줄입니다. 44444444444444444
마지막 줄입니다. 
"""

try:
    # 파일 읽기
    file = open("./write_test_folder/test.txt",'r',encoding="utf-8") # 변수에 담아서 사용할때는 반드시 닫아줘야 한다.

    #속성확인
    print(dir(file))

    # 출력:
    # ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_su
    # bclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable
    # ', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']

    # 인코딩 확인
    print(file.encoding) # 출력: utf-8

    # 파일 이름
    print(file.name) #출력: ./write_test_folder/test.txt

    # 모드 확인
    print(file.mode) # 출력: r
    cts = file.read()
    print(cts)
    # 출력:
    # 이것은 파일 입출력 테스트 파일입니다.
    # 2번째 줄입니다. 222222222222222222222222
    # 3번째 줄입니다. 333333333333333333
    # 4번째 줄입니다. 44444444444444444
    # 마지막 줄입니다.

    file.close()
except FileNotFoundError:
    print("파일이 없습니다.")
print("================================")

# with문 사용  -> with문이 끝나면 자동으로 close 되므로 close 함수를 사용할 필요가 없다.
with open("./write_test_folder/test.txt",'r',encoding="utf-8") as f:
    c = f.read(10) # read함수 안에 매개변수가 있으면 해당 값의 바이트수만큼 가져온다. ex) read(10) -> 10바이트
    print(c) #출력: 이것은 파일 입출
    print(iter(c)) #출력: <str_iterator object at 0x0000018B5B797F70>
    print(list(c)) # 출력: ['\n', '이', '것', '은', ' ', '파', '일', ' ', '입', '출']
    f.seek(0,0) # 초기화
    d = f.readline() # 한줄씩 출력
print("================================")

# readline -> 한줄씩 출력
with open("./write_test_folder/test.txt",'r',encoding="utf-8") as f:
    c = f.readline()
    print(c) # 출력: 이것은 파일 입출력 테스트 파일입니다.

print("================================")

# readlines -> 전체를 읽은 후 라인단위로 리스트로 저장
with open("./write_test_folder/test.txt",'r',encoding="utf-8") as f:
    c = f.readlines()
    print(c) # 출력: ['\n', '이것은 파일 입출력 테스트 파일입니다.\n', '2번째 줄입니다. 222222222222222222222222\n', '3번째 줄입니다. 333333333333333333\n', '4번째 줄입니다. 44444444444444444\n', '마지막 줄입니다. \n']
print("================================")

3) 쓰기

쓰기는 파일을 생성하거나 기존파일의 정보를 수정하는 것을 의미합니다.

기본값은 w, a등이 있으며 보조속성은 읽기와 동일하게 t,b가 있습니다.

이때 w는 파일의 내용을 지우고 새로 작성하는 것이며, a는 기존의 내용이 있으면 뒤에 연결하는 것입니다. 

# 옵션 w -> write
with open("./write_test_folder/test.txt","w",encoding="utf-8") as file:
    file.write("입출력 부분 중 쓰기\n")

#옵션 a -> append
with open("./write_test_folder/test.txt","a",encoding="utf-8") as file:
    file.write("내용 추가\n")

#옵션 writelines -> 리스트를 파일로 변환
with open("./write_test_folder/test.txt","w",encoding="utf-8") as file:
    list= ["apple\n","banana\n","melon\n"]
    file.writelines(list)

#옵션 print 함수와 결합
with open("./write_test_folder/test.txt","w",encoding="utf-8") as file:
    print("print함수와 결합",file=file)
    print("print함수와 결합", file=file)
    print("print함수와 결합", file=file)

 

3. CSV 파일 입출력

샘플 CSV 파일은 아래 사이트에서 가져올 수 있습니다.

샘플 CSV 파일 - IBM Documentation

 

샘플 CSV 파일

샘플은 키 데이터 오브젝트에 대한 CSV를 제공합니다. 샘플 CSV 파일을 다운로드하여 데이터의 형식이 올바른지 확인할 수 있습니다. 표 1. 샘플 CSV 파일 샘플 CSV 파일 설명 sample_data.zip 다음 오브

www.ibm.com

 

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

# csv 파일 통신: MemeType : text/csv
import csv

with open("./Sample data v2/Catalog_v2.csv","r",encoding="utf-8") as f:
    reader = csv.reader(f)
    # next(reader)
    #객체확인
    print(reader)
    #타입확인
    print(type(reader))
    # 속성확인
    print(dir(reader))

    for c in reader:
        print(c) # 리스트 형태로 출력
        print(" : ".join(c)) # 리스트의 내용을 :로 구분하여 출력
print("=====================================")

with open("./Sample data v2/Catalog_v2.csv","r",encoding="utf-8") as f:
    # delimiter값으로 분리하여 리스트로 만들 수 있다.
    # delimiter값이 없다면 분리되지 않는다.
    reader = csv.reader(f,delimiter=",")

    for i in reader:
        print("aaa"+str(i))
print("=====================================")

with open("./Sample data v2/Catalog_v2.csv","r",encoding="utf-8") as f:
    # 딕셔너리 형태로 반환
    reader = csv.DictReader(f)
    print(reader)
    print(type(reader))
    print(dir(reader))

    for i in reader:
        for k,v in i.items():
            print(f"key: {k}, value : {v}")
        print("---------")


# 중첩리스트
double_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]]

with open("test.csv","w",encoding="utf-8") as f:
    print(dir(csv))
    wt = csv.writer(f)

    for v in double_list:
        wt.writerow(v) #내부의 리스트가 하나의 행이 된다.

# test.csv 생성

# 1,2,3
#
# 4,5,6
#
# 7,8,9
#
# 10,11,12
#
# 13,14,15
#
# 16,17,18
#
# 19,20,21

with open("test2.csv","w",encoding="utf-8") as f:

    fields = ["column1","column2","column3"]
    # fieldnames을 지정하고 writerow를 사용하면 fields의 요소하나하나가 열 제목이 된다.
    wt = csv.DictWriter(f,fieldnames=fields)

    wt.writeheader() # 헤더 작성

    for v in double_list:
        wt.writerow({'column1':v[0],"column2":v[1],"column3":v[2]})

# csv 파일 생성

# column1,column2,column3
#
# 1,2,3
#
# 4,5,6
#
# 7,8,9
#
# 10,11,12
#
# 13,14,15
#
# 16,17,18
#
# 19,20,21

3. pickle

파이썬의 pickle은 파이썬 객체를 직렬화(serialize)하고 역직렬화(deserialize)하는 데 사용되는 모듈입니다. 직렬화는 파이썬 객체를 바이트 스트림으로 변환하는 작업을 말하며, 역직렬화는 바이트 스트림을 다시 파이썬 객체로 변환하는 작업을 말합니다. pickle 모듈을 사용하면 객체를 파일에 저장하거나 네트워크로 전송하기 위해 바이트 스트림으로 변환할 수 있습니다.

 

1) dump()

import pickle

profile_file = open("profile.pickle","wb") #wb는 쓰기&바이너리타입(피클에서는 반드시 해야함) pickle에서는 인코딩이 필요없다.

profile = {"이름":"영주","나이":30,"취미":["크로스핏","주짓수","코딩"]}

print(profile) #출력: {'이름': '영주', '나이': 30, '취미': ['크로스핏', '주짓수', '코딩']}
pickle.dump(profile,profile_file) #profile에 있는 정보를 file에 저장
profile_file.close()

 

2) load()

import pickle

profile_file = open("profile.pickle","rb") #wb는 쓰기&바이너리타입(피클에서는 반드시 해야함) pickle에서는 인코딩이 필요없다.

profile = pickle.load(profile_file) #file에 있는 정보를 profile에 불러오기

print(profile)
profile_file.close()

'PYTHON Programming > Python' 카테고리의 다른 글

[python] 매직 메서드  (0) 2024.05.11
[python] 클래스  (0) 2024.05.11
[python] 함수  (0) 2024.04.23
[python] 컴프리헨션  (0) 2024.04.23
[python] 반복문  (0) 2024.04.23