Python

프로젝트 정리 - JSON, 모듈, 파일 읽고 쓰기 (00-03)

김디니 2022. 7. 15. 22:21

JSON 이란?

Key- Value 쌍으로 이루어진 데이터 객체를 전달하기 위해 텍스트를 사용한다.

모듈이란?

다양한 기능을 하나의 파일로 모아놓은 것이다.

패키지란?

다양한 파일을 하나의 폴더로 구성한 것이다.

라이브러리란?

다양한 패키지를 하나의 묶음으로 구성해놓은 것이다.

이것을 관리하는 것은 pip이다.

 

파이썬 표준 라이브러리

파이썬에 기본적으로 설치된 모듈과 내장함수가 포함되어 있다.

import를 통해 모듈을 불러오게 한다.

import module

datetime

날짜와 시각을 알려준다.

import datetime

now = datetime.datetime.now() # 현재 시각
print(now, type(now))

random

랜덤한 것을 리스트로 출력할 수 있도록 한다.

예를 들어, 로또 번호 뽑기가 있다.

import random

numbers = random.sample([1, 2, 3], 2)
print(numbers, type(numbers))
#출력: [1, 2] <class 'list'> -> 리스트를 반환한다. 

# 로또번호 뽑기

import random

numbers = random.sample(range(1, 46), 6)
print(numbers, type(numbers))

 

파일 읽고 쓰기

코드를 통해 파일을 생성하고 쓰고 읽을 수 있다.

with open('test.txt', 'w', encoding='utf-8') as f: # 'w'는 쓰기 전용이다. 
    f.write('Happy Friday!')
    for i in range(1, 6):
        f.write(f'{i} 번째\n') #마법의 f 사용

# 새로운 파일을 만들고, 내용도 추가해준다. 

with open('students.txt', 'r', encoding='utf-8') as f: # 'r'는 읽기 전용이다.
    # 테스트는 string 타입
    text = f.read() # 전체를 한번에 읽는 함수
    print(text, type(text))
    

    # string.split() -> 리스트 타입
    names = text.split()
    cnt = 0
    for name in names:
        # 이름의 첫 글자가 '김'인 사람이 있으면 카운트해줘
        if name[0] == '김': #if name.startswith('김'): 도 가능하다. 
            cnt += 1
    print(cnt)

#f.readline()
with open('students.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line, end='') # end='': 엔터 없이 출력한다. 기능에 이미 엔터가 들어갔기 때문. 

# 문서 내용의 한줄을 문자열로 반환한다. 딱 한 줄만 

# 문자를 모두 읽으려면 반복문을 작성해야 한다.

 

파이썬의 JSON 활용

import json
# 1. 파일을 열고
# 2. JSON을 파이썬 객체 형식으로 한다. 

kospi = open('stocks.json', 'r'encoding='utf-8')
kospi = json.load(f)
print(kospi['stocks'][0]) #첫 줄에 있는 삼성전자 뽑아보기

# 딕셔너리 예쁘게 출력하기
import json
from pprint import pprint # pretty print

 

문제 0.

특정 내용을 .txt에 기록한다.

with open('00.txt', 'w', encoding='utf-8') as f:
    f.write('N회차 김디니\n')
    f.write('Hello, Python!\n')
    for i in range(5):
        f.write(f'{i + 1}일차 파이썬 공부 중\n')

with open~ : 00.txt 파일을 생성한다.

00.txt 파일에 '2회차 김예린', 'Hello, Python!', 'N일차 파이썬 공부 중'을 입력한다.

'\n'을 이용하여 개행(줄 바꿈)을 실행한다.

'N일차 파이썬 공부 중'에서 N은 {i + 1}과 range(5)로 5일차까지 작성하도록 한다.

 

문제 1.

과일 데이터가 담긴 fruits.txt에서 총 과일의 객수를 구하고, 이를 01.txt에 기록한다.

cnt = 0

with open('data/fruits.txt', 'r', encoding='utf-8') as f:
    text = f.readlines() # 파일 전체의 라인 수 
    for i in text:
        cnt += 1 
    print(cnt)

with open('01.txt', 'w', encoding='utf-8') as f:
    f.write(str(cnt))

with open: data 폴더에 있는 fruits.txt를 열어서 읽도록('r') 한다.

text = f.readlines(): fruits.txt에 있는 전체 라인 수를 읽어내도록 한다.

이후 for문을 통해 읽은 라인의 수를 cnt라는 변수에 담아낸다.

라인 수를 담아낸 cnt 변수를 출력한다. (print)

with open: 01.txt 파일을 생성하고,

f.write(str(cnt)): 위의 cnt 변수를 내용으로 작성하도록 한다.

 

문제 2.

과일 데이터가 담긴 fruits.txt에서 berry로 끝나는 과일의 갯수와 목록을 02.txt 에 기록한다.

berries = set()

with open('data/fruits.txt', 'r', encoding='utf-8') as f:
    text = f.read() # 전체 읽기 및 string type
    line = text.split('\n')

berries 변수에 set() 함수를 적용한다. 중복된 값을 자동으로 제거되도록 해준다.

text = f.read()는 fruits.txt를 전체 읽을 뿐만 아니라 string type을 적용시켜준다.

line = text.split('\n'): 이미 fruits.txt에는 개행이 이루어졌기 때문에 split('\n')을 기입한다.

for fruit in line:
        if fruit.endswith('berry'):
            berries.add(fruit)

endswith('berry')

이 문제의 핵심 포인트일 것이다.

fruits.txt에는 berry로 포함된 함정 데이터들이 있다. 하지만 berry로 끝나는 과일의 데이터를 얻기 위해서는 endswith를 사용해야 한다.

'berry' in fruit를 사용했다면 원하는 데이터를 얻을 수 없거나 에러가 뜰 것이다. (경험담^^!)

print(len(berries))

내장 함수인 len()을 사용하여 berries 변수에 담아낸 berry로 끝나는 과일 단어를 정수로 출력하도록 한다.

with open('02.txt', 'w', encoding='utf-8') as f:
    f.write(f'{len(berries)}\n')
    for i in range(len(berries)):
        f.write(f'{berries.pop()}\n')

02.txt를 생성하고 berries에 담아낸 데이터의 개수와 이름들을 개행과 함께 작성하도록 한다.

 

문제 3.

과일 데이터가 담긴 fruits.txt를 이용하여 전체 과일의 이름과 개수를 03.txt에 기록한다.

import pprint

cnt_fruits = {}

딕셔너리를 예쁘고 깔끔하게 개행되도록 추출하기 위해 pprint를 import한다. (pprint가 pretty print의 준말?이다. 먼가 쁘띠귀욤)

with open('data/fruits.txt', 'r', encoding='utf-8') as f:
    text = f.read() 
    line = text.split('\n')

    for fruits in line:
        if fruits in cnt_fruits:
            cnt_fruits[fruits] += 1
        else:
            cnt_fruits[fruits] = 1

중복되는 과일 단어들은 1씩 추가가 되도록 해주었고, 이 조건이 아닌 경우 그대로 1로 두도록 한다.

pprint.pprint(cnt_fruits)

with open('03.txt', 'w', encoding='utf-8') as f:
    for k, v in cnt_fruits.items():
        f.write(f'{k} {v}\n')

03.txt 파일을 생성해주었고,

items()함수를 사용하여 키와 값(k, v)들의 쌍을 얻도록 한다.

Boysenberry 3
Blueberry 4
Avocado 1
Marionberry 3
Date 9

그리하여 딕셔너리 형태의 키와 값을 출력하도록 해준다.

 

 

(상세한 내용은 추후에 업데이트 하겠읍니다,,)

 

참고: https://wikidocs.net