반응형

파이썬 JSON 파일 읽고 저장하기는 API나 설정 파일을 다룰 때 자주 쓰는 작업이다.

JSON은 딕셔너리와 구조가 비슷해서 파이썬과 잘 맞는다.

그래서 CSV 다음으로 많이 배우는 파일 형식 중 하나다.

 

- JSON 파일 저장하기

아래 코드는 파이썬 딕셔너리를 JSON 파일로 저장하는 예제다.

import json

data = {
    "name": "민수",
    "age": 27,
    "city": "Seoul"
}

with open("user.json", "w", encoding="utf-8") as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

 

- JSON 파일 읽기

저장한 JSON 파일을 읽는 코드는 아래와 같다.

import json

with open("user.json", "r", encoding="utf-8") as file:
    data = json.load(file)

print(data)
print(data["name"])

 

- 왜 ensure_ascii=False를 넣는가

이 옵션을 넣지 않으면 한글이 유니코드 형태로 저장될 수 있다.

한글을 그대로 보이게 하려면 ensure_ascii=False를 넣는 편이 좋다.

indent=4는 들여쓰기를 넣어 읽기 좋게 만들어준다.

 

- 실행 결과 예시

{
    "name": "민수",
    "age": 27,
    "city": "Seoul"
}

 

- 정리하며

파이썬 JSON 파일 읽고 저장하기는 json.dump와 json.load만 익히면 바로 사용할 수 있다.

설정 파일이나 API 응답 데이터를 다룰 때 매우 자주 쓰이므로 꼭 익혀둘 만하다.

반응형
반응형

파이썬 TXT 파일 읽기와 쓰기는 가장 기본적인 파일 처리다.

메모장 파일을 저장하거나 불러오는 작업은 CSV보다 더 단순해서 입문자가 익히기 좋다.

로그 저장이나 간단한 메모 자동화에도 자주 사용된다.

 

- TXT 파일 쓰기

아래 코드는 텍스트 파일을 새로 만들어 내용을 저장하는 예제다.

text = "파이썬 파일 처리 연습입니다.\n오늘은 txt 파일을 저장합니다."

with open("memo.txt", "w", encoding="utf-8") as file:
    file.write(text)

print("memo.txt 저장 완료")

 

- TXT 파일 읽기

저장한 파일을 다시 읽는 코드는 아래와 같다.

with open("memo.txt", "r", encoding="utf-8") as file:
    content = file.read()

print(content)

 

- 한 줄씩 읽으려면

로그 파일처럼 줄 단위로 처리할 때는 for문을 많이 쓴다.

with open("memo.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

 

- 자주 하는 실수

  • encoding을 안 넣어서 한글이 깨지는 경우
  • "w" 모드로 열어서 기존 내용을 덮어쓰는 경우
  • 줄바꿈 문자 \n을 안 넣어서 한 줄로 붙는 경우

 

- 이런 경우에 유용하다

메모 자동 저장

로그 파일 읽기

간단한 설정 파일 만들기

출력 결과를 텍스트로 남기기

 

- 정리하며

파이썬 TXT 파일 읽기와 쓰기는 open 함수만 이해해도 바로 시작할 수 있다.

읽기와 쓰기 모드, encoding, 줄바꿈만 익혀두면 다양한 파일 작업으로 확장하기 쉽다.

반응형
반응형

파이썬으로 CSV를 다루다 보면 한글 깨짐 문제를 자주 만나게 된다.

특히 엑셀에서 열었을 때 글자가 이상하게 보이면 encoding 문제일 가능성이 크다.

이 글에서는 파이썬 한글 CSV 깨짐 해결 방법을 가장 기본적인 형태로 정리해본다.

 

- 왜 한글이 깨질까

파일 자체는 정상인데 읽는 프로그램이 다른 문자 인코딩으로 해석하면 한글이 깨질 수 있다.

파이썬에서는 주로 utf-8을 많이 쓴다.

하지만 윈도우 환경이나 오래된 프로그램은 cp949를 쓰는 경우도 많다.

엑셀에서는 utf-8-sig가 더 안전한 경우가 많다.

 

- CSV 저장할 때 가장 많이 쓰는 방식

import csv

rows = [
    ["이름", "메모"],
    ["민수", "테스트 데이터"],
    ["지은", "한글 저장 확인"]
]

with open("korean.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.writer(file)
    writer.writerows(rows)

 

- 이미 저장된 파일을 읽을 때

상대가 어떤 인코딩으로 저장했는지 모르면 하나씩 시도해봐야 한다.

import csv

with open("korean.csv", "r", newline="", encoding="utf-8-sig") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

만약 깨진다면 cp949로 다시 시도할 수 있다.

import csv

with open("korean.csv", "r", newline="", encoding="cp949") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

 

- utf-8, utf-8-sig, cp949 차이

  • utf-8은 가장 일반적인 인코딩이다.
  • utf-8-sig는 엑셀에서 한글 깨짐을 줄일 때 자주 쓴다.
  • cp949는 윈도우 환경에서 오래전부터 많이 쓰인 한글 인코딩이다.

 

- 실무에서는 어떻게 처리하면 되나

  1. 내가 새로 만드는 CSV는 utf-8-sig로 저장한다.
  2. 외부에서 받은 CSV는 utf-8-sig와 cp949를 순서대로 확인한다.
  3. 엑셀로 열어봐야 한다면 utf-8-sig를 우선 고려한다.

 

- 정리하며

파이썬 한글 CSV 깨짐 해결의 핵심은 인코딩이다.

새 파일을 만들 때는 utf-8-sig를 쓰고 외부 파일은 utf-8-sig와 cp949를 먼저 의심하면 된다.

반응형
반응형

파이썬 CSV 파일 읽기는 저장보다 더 자주 쓰는 작업이다.

이미 있는 데이터를 불러와서 출력하거나 가공할 때 기본이 된다.

엑셀 파일보다 가볍고 다루기 쉬워서 CSV를 먼저 익혀두면 실무에 도움이 된다.

 

- 가장 기본적인 CSV 읽기

아래 코드는 CSV 파일 내용을 한 줄씩 읽어서 출력하는 예제다.

import csv

with open("people.csv", "r", newline="", encoding="utf-8-sig") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

 

- 실행 결과

위 코드를 실행하면 각 행이 리스트 형태로 출력된다.

['이름', '나이', '지역']
['민수', '27', '서울']
['지은', '31', '부산']
['현우', '29', '대전']

 

- 특정 열만 가져오려면

이름만 출력하고 싶다면 인덱스로 접근하면 된다.

import csv

with open("people.csv", "r", newline="", encoding="utf-8-sig") as file:
    reader = csv.reader(file)
    next(reader)

    for row in reader:
        print(row[0])

 

- 코드 설명

  • csv.reader()는 CSV 내용을 한 줄씩 읽는다.
  • next(reader)는 첫 줄 제목 행을 건너뛴다.
  • row[0]은 첫 번째 열을 의미한다.

 

- 자주 하는 실수

  1. 한글 CSV를 읽는데 encoding을 안 맞춰서 깨지는 경우
  2. 제목 행까지 데이터로 처리하는 경우
  3. row[3]처럼 존재하지 않는 열 번호를 써서 오류가 나는 경우

 

- 정리하며

파이썬 CSV 파일 읽기는 csv.reader만 익혀도 바로 시작할 수 있다.

제목 행 건너뛰기와 열 인덱스 접근까지 익혀두면 대부분의 기본 작업은 처리할 수 있다.

반응형
반응형

파이썬 CSV 파일 만들기는 파일 처리 입문에서 가장 많이 찾는 작업 중 하나다.

엑셀 없이도 데이터를 표 형태로 저장할 수 있어서 실무에서도 자주 쓴다.

특히 목록 데이터를 저장하거나 다른 프로그램으로 넘길 때 CSV 형식이 많이 사용된다.

 

- CSV 파일이란

CSV는 쉼표로 데이터를 구분한 텍스트 파일이다.

엑셀에서도 쉽게 열 수 있고 대부분의 데이터 도구와 호환된다.

그래서 파이썬으로 데이터를 저장할 때 가장 먼저 배우는 파일 형식이다.

 

- 파이썬으로 CSV 파일 만들기

아래 예제는 이름과 나이, 지역 데이터를 CSV 파일로 저장하는 가장 기본적인 코드다.

import csv

rows = [
    ["이름", "나이", "지역"],
    ["민수", 27, "서울"],
    ["지은", 31, "부산"],
    ["현우", 29, "대전"]
]

with open("people.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.writer(file)
    writer.writerows(rows)

print("people.csv 파일 저장 완료")

 

- 코드 설명

  1. import csv로 CSV 전용 모듈을 불러온다.
  2. rows에 저장할 데이터를 리스트로 준비한다.
  3. open(..., "w")로 쓰기 모드로 파일을 연다.
  4. newline=""은 빈 줄이 생기는 문제를 막아준다.
  5. encoding="utf-8-sig"는 엑셀에서 한글이 깨질 확률을 줄여준다.
  6. writerows()로 여러 줄을 한 번에 저장한다.

 

- 저장 결과

위 코드를 실행하면 같은 폴더에 people.csv 파일이 생성된다.

파일을 열면 아래와 비슷한 형태로 저장된다.

이름,나이,지역
민수,27,서울
지은,31,부산
현우,29,대전

 

- 자주 하는 실수

  • encoding을 지정하지 않아 한글이 깨지는 경우
  • newline=""을 안 넣어서 줄 사이에 빈 줄이 생기는 경우
  • list 대신 문자열 하나만 넘겨서 한 글자씩 쪼개지는 경우

 

- 이런 경우에 많이 씁니다

회원 목록 저장

주문 데이터 저장

크롤링 결과 저장

엑셀로 넘길 중간 파일 만들기

 

- 정리하며

파이썬 CSV 파일 만들기는 문법이 어렵지 않다.

핵심은 csv 모듈을 사용하고 newline과 encoding을 제대로 넣는 것이다.

이 기본만 익혀두면 이후 CSV 읽기와 합치기까지 훨씬 쉽게 이어갈 수 있다.

반응형
반응형

 

1. 문제

    1789번 수들의 합 (https://www.acmicpc.net/problem/1789)

 

서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?

 

 

2. 문제 포인트

  • 중복되지 않는 자연수 개수 구하기

 

반응형

 

3. 접근법

  • S를 자연수로 하나씩 빼면서 총 개수를 구한다
  • 1, 2, 3... 숫자 하나씩을 S에서 빼면서 계산하다가 뺄 수(n)보다 S의  나머지가 작은 경우 반복문을 종료한다.
    ex. 15인 경우
           15 - 1 - 2 - 3 - 4 - 5  = 0  >> 5번
           17 - 1 - 2 - 3 - 4 - 7 = 0  >>  5번
             - 1~5까지 빼면 17은 2가 남게 됨
             - 1~4까지 빼고 7을 빼면 중복되지 않은 자연수들로 계산이 가능

 

4. 결과 코드

import sys

a = int(sys.stdin.readline().strip())

# 숫자 사용 횟수
cnt = 0
# 계산에 사용될 숫자
num = 1

while True:
    # 입력받은 숫자에서 1부터 하나씩 빼서 숫자 사용 횟수 계산
    a -= num
    cnt += 1
    num += 1

    # 1부터 1씩 증가한 num이 a의 나머지값보다 크면 숫자가 중복되어 사용되기에
    # num이 a보다 크게 되는 경우 루프 종료
    if num > a:
        break

print(cnt)

# 1789번 수들의 합
# https://www.acmicpc.net/problem/1789
반응형
반응형

 

1. 문제

    1439번 뒤집기 (https://www.acmicpc.net/problem/1439)

 

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.

예를 들어 S=0001100 일 때,

  1. 전체를 뒤집으면 1110011이 된다.
  2. 4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.

하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.

문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.

 

 

2. 문제 포인트

  • 0과 1로 이루어진 문자열 입력
  • 모두 같은 숫자로 만들기 (0, 1 무관)
  • 한번에 근접한 문자 같이 뒤집기 가능

 

반응형

 

3. 접근법

  • 모든 숫자를 0으로 만들때와 1로 만들때를 구한 후 작은 값 출력
  • 전체를 1을 만드는 뒤집기 횟수 ==  split("0")으로 리스트를 생성한 후 만든 요소의 개수
  • 전체를 0을 만드는 뒤집기 횟수 ==  split("1")으로 리스트를 생성한 후 만든 요소의 개수
  • min()으로 두가지 경우 중 작은 값 출력

 

 

4. 결과 코드

import sys

a = sys.stdin.readline().strip()

# 1, 0을 기준으로 문자열을 나눠 리스트 만들기
## list comprehension을 이용하여 내용없는 요소는 제거
b = [bb for bb in a.split("1") if bb]
c = [cc for cc in a.split("0") if cc]

print(min(len(b), len(c)))

# 1439번 뒤집기
# https://www.acmicpc.net/problem/1439
반응형
반응형

 

1. 문제

    문제번호 문제 타이틀 (https://www.acmicpc.net/problem/14916)

 

춘향이는 편의점 카운터에서 일한다.

손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오.

예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다.

 

 

2. 문제 포인트

  • 동전은 2원, 5원만 있다
  • 동전의 최소 개수를 구한다

 

반응형

 

3. 접근법

  • 이전에 했던 거스름돈 문제와의 차이점
    - 이전문제 : https://hostramus.tistory.com/148
    - 동전이 5원과 2원 2가지다 (point. 5원은 2원의 배수가 아니다)
    - 13원인경우 5 * 1 + 2 * 4 = 13이다 (5원동전을 무조건 먼저 사용해선 안된다)
       ex 1. 13원 = 5 * 1 + 2 * 4  (잔액이 10보다 크지만 5원동전 2개 불가)
       ex 1. 21원 = 5 * 3 + 2 * 3  (잔액이 10보다 크지만 5원동전 4개 불가)
  • 2원의 개수를 0개부터 한개씩 늘려가면서 계산한다.

 

4. 결과 코드

import sys

a = int(sys.stdin.readline().strip())

cnt = 0

while a>0:
    # 입력받은 a값이 5의 배수면 5원짜리로 거슬러주는것이 가장 작은 동전수
    if a % 5 == 0:
        cnt += a // 5
        break
    # 5원짜리로 안될때 2원짜리를 한개씩 늘려가며 최소 개수를 찾기
    else:
        a -= 2
        cnt += 1
        if a < 0:
            cnt = -1

print(cnt)

# 14916번 거스름돈
# https://www.acmicpc.net/problem/14916
반응형

+ Recent posts