본문 바로가기

Python

PhCharm - csv , json, binary


# CSV
# comma separated values
# 각 행의 컬럼값들이 쉼표로 분리된 텍스트 형식파일
# 헤교, 87, 67, 56, 2997, 85.9, 우  같은 행들
# 보통, csv 파일의 첫행에는 각 컬럼을 의미하는 제목을 작성
# 간혹 컬럼값에 , 가 포함되는 경우, 이중인용부호로 감싸서 감싸서 처리
# ex) 변화하는 세계 질서,레이 달리오(Ray Dalio) ,"34,200원"
import csv

# 핫도그 우승자파일을 읽어옴
with open('hotdog-winners.csv') as f:
    data = csv.reader(f)
    print(list(data))

with open('hotdog-winners.csv') as f:
    data = csv.reader(f)
    for d in data:
        print(d)           # 각 행을 리스트로 변환해서 읽어옴

with open('hotdog-winners.csv') as f:
    data = csv.reader(f)
    next(data)             # 첫행은 그냥 흘림
    for d in data:
        print(d)

with open('summermedals.csv', encoding='utf-8') as f:
    data = csv.reader(f)
    next(data)
    for d in data:
        print(d)


# DictReader
# csv 파일의 헤더행의 컬럼명과 각 컬럼의 값을 조합해서
# dict형식으로 데이터를 출력해줌 (반드시 헤더행 포함!)

# ex) name, kor, eng, mat
#     혜교, 99, 98, 99
#  => {'name':'혜교', 'kor':'99', 'eng':'98', 'mat':99}
with open('hotdog-winners.csv', encoding='utf-8') as f:
    data = csv.DictReader(f)
    print(list(data))   #리스트로 변환해서 읽어옴


# csv 파일형식 기록하기
data = [['혜교',98.54,65], ['지현',43,65,78], ['수지',87,54,75]]

with open('sj.dat', 'w', encoding='utf-8') as f:
    cw = csv.writer(f)
    for d in data:         # 행단위로 한줄씩 파일에 저장
        cw.writerow(d)

with open('sj.dat', 'w', encoding='utf-8') as f:
    cw = csv.writer(f)
    cw.writerow(data)   # 리스트 단위로 모두 파일에 저장


# DictWriter

# JSON
# javascript object notation
# 자바스크립트 문법 기반 경량형 데이터 객체 표현
# 주로 서버와 클라이언트간 데이터 교환에 주로 많이 사용
# => 마이크로 서비스 환경하에서 REST API 를 이용한
# 어플리케이션에 주로 사용
# 이전에 사용되던 XML 보다 유연하고 단순하여 널리 사용

import json

user = {'userid':'abc123','passwd':'987xyz','name':'abc123','email':'987xyz@abc123.com'}

# dict, list, tuple등을 json 형식의 문자열로 변경
# 데이터를 파일에 저장하거나 네트워크를 통해 다른곳으로 전송할 때 사용
jsobj = json.dumps(user)

print(jsobj, type(jsobj))

# json 문자열을 dict, list, tuple로 변경
# 파일에 저장된 데이터를 메모리에 올려
# 원래형식의 데이터로 바꿈
dict = json.loads(jsobj)
print(dict['name'], dict['email'])

# json 변환시 한글처리
# 기본적으로 유니코드로 인코딩되어 변환
# 유니코드로 변환되게 하지 않으려면 ensure_ascii 옵션 지정
info = {'name':'홍길동', 'addr':'서울 구로구'}

obj=json.dumps(info)
print(obj)

obj2 = json.dumps(info, ensure_ascii=False)
print(obj2)


# CSV  vs   Json
# csv는 오프라인 시스템간 데이터 교환에 주로 사용
# 비즈니스, 마케팅, 데이터 과학등 다양하게 활용
# DBMS나 엑셀등의 프로그램에서도 작업내용을 csv로 저장가능

# json은 온라인 시스템간 데이터 교환에 주로 사용
# rest api 를 이용한 클라이언트 서버간 데이터 교환에 활용
# mongodb등의 빅데이터 저장 시스템의 기본형식으로 채택


# REST(Representational State Transfer)의 약자
# 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미

# 즉 REST란
# HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
# HTTP Method(POST, GET, PUT, DELETE)를 통해
# 해당 자원(URI)에 대한 CRUD 작업을 실행하는 것을 의미


# ex) zipcode.do?sido=서울&gugun=구로구&get=1
# ex) zipcode/서울/구로구/1   간소화, rest full

 

# 바이너리 파일 다루기
# 내용이 문자가 아닌 비트로 저장된 파일
# 실행파일, 이미지파일, 동영상 파일 등등
# 텍스트파일보다 처리속도나 저장공단이 작음
# 파일생성/읽기 시 b 모드 사용

# 한글 텍스트를 바이너리 파일로 저장
text = '파이썬은 완전 재미있어요!'

with open('text.txt', 'w', encoding='utf-8') as f:
    f.write(text)
# 텍스트형식으로 저장, 기본 인코딩 : euc-kr

with open('text.bin', 'wb') as f:
    f.write(text.encode())
# 바이너리형식으로 저장, 기본 인코딩 : utf-8


# 좀 더 올바르게 바이너리로 저장
# struct 모듈을 이용하면 텍스트나 숫자형을 바이너리로 저장 가능
# 또한, 파일에 저장하는 경우 데이터의 형식을 유지할 수 있음

# pack :    정수, 실수, 문자열 등을 byte 객체로 변환
#          서식 지정문자 : c(문자1), b(정수1), i(정수4),
#                         l (부호없는정수4), f(실수4), d(실수8), s(문자열)
# unpack

import struct

# 점수 데이터를 바이너리로 저장
kor = 99
eng = 98
mat = 99

with open('jumsju.txt', 'wb') as f:
    nums = f'{kor} {eng} {mat}'
    f.write(nums.encode())

with open('jumsu.bin' ,'wb'  ) as f:
    nums = struct.pack('iii',kor,eng,mat)
    f.write(nums)   # 바이너리형식으로 저장되었음


# 이름, 점수 데이터를 바이너리로 저장
# 6'혜교'99989929799.8  지정한 순서만큼 , 길이만큼 읽어들이면 본래모습나타남
name = '혜교'
tot = 297
avg = 99.8

txt_data = name.encode()
txt_data = struct.pack('i', len(txt_data)) + txt_data
                         #읽어들일문자수   +   실제 문자열데이터
print(txt_data, len(txt_data))

nums_data = struct.pack('iiiif',kor,eng,mat,tot,avg)
print(nums_data)


# 문자 + 숫자 데이터 unpack
data = txt_data + nums_data
with open('jumsu2.bin', 'wb') as f:
    f.write(data)




#  바이너리 파일 읽기
with open('jumsu.bin', 'rb') as f:
    data = f.read()
print(data)
# struct 모듈로 pack한 바이너리 파일은
# unpack으로 원래 상태의 데이터로 되돌리 수 있음
kor, eng, mat = struct.unpack('iii',data)
print(kor,eng,mat)




# 문자를 출력하기 위해 문자 길이 조사
# 문자 길이는 정수형으로 4byte에 저장했으므로
strlen = struct.unpack('i', data[:4])
print(strlen)

# 실제 문자가 저장된 영역은
# 문자길이가 저장된 영역이후 + 문자길이
name = data[4:(4+strlen)].decode()
print(name)

kor,eng,mat,tot,avg = \
    struct.unpack('iiiif', data[(4+strlen):])
print(kor,eng,mat,tot,avg)

# 바이너리는 일렬로 모두 정렬해버림 -> 글자 길이를 지정하여 변환하여 이름만 출력





# 1234561234567  text   : 13
#                binary : 8 바이트

'Python' 카테고리의 다른 글

PyCharm - 데이터베이스 (sqlite3)  (0) 2022.05.18
PhCharm - pickle  (0) 2022.05.18
PhCharm - 파일 입출력  (0) 2022.05.17
PyCharm - except  (0) 2022.05.17
PyCharm - 모듈  (0) 2022.05.17