728x90
반응형

파이썬 CSV 모듈 쓰기, 읽기, 수정

 

안녕하세요 :-)

파이썬에서 csv 파일에 쓰고, 읽고, 수정(추가)하는 방법입니다.

파이썬 언어로는 주로 데이터를 다룰 텐데 도출된 데이터 혹은 중간 데이터를 엑셀 또는 csv 파일로 내보내는 것이 필요할 때가 있습니다.
파이썬에는 csv 모듈이 있어서 간단하게 구현이 가능합니다.

참고로 CSV란 Comma Separated Values로 '쉼표로 구분된 값'이라는 뜻입니다. 

 

1. 파일 읽기

import csv
with open('filename.csv', 'r', newline='', encoding='utf-8-sig') as csv_file:
    reader = csv.reader(csv_file, delimiter=',', quotechar='"')
    for row in reader:
        print(", ".join(row))

#1 csv 모듈을 import 합니다.
#2 csv_file 이름으로 'filename.csv' 파일을 'r' 옵션으로 읽습니다.
#3 reader라는 객체로 한줄 한 줄 읽어옵니다.
#4 각 행은 문자열 리스트로 반환됩니다.

 

2. 파일 쓰기

import csv
header = ['first', 'second', 'third']
with open('filename.csv', 'w', newline='') as csv_file:
    writer = csv.writer(csv_file, delimiter=',', quotechar='"')
    writer.writerow(header)
    writer.writerow(['first value', 'second value', 'third value'])

#1 csv 모듈을 import 합니다.
#2 header를 정의합니다.
#3 csv_file 이름으로 'filename.csv' 파일을 'w' 옵션으로 씁니다.
#4 writer라는 객체를 생성합니다.
#5 writerow를 통해 헤더를 쓰고, 아래줄에 넣을 값을 입력합니다.

 

3. 파일 수정

파일 수정은 간단합니다. 'r', 'w' 옵션 자리에 'a'를 넣으면 append의 개념으로 아래 줄에 추가가 됩니다.

 

그럼 궁금한게 있다면 아래 댓글로 남겨주세요!

이만 :)

728x90
반응형
728x90
반응형

딕셔너리(dictionary) 생성 & 초기화

 

 

파이썬에서 딕셔너리를 생성하고 iterable하게 값을 넣어주고 싶을 때가 있는데, 
이때 key값이 존재하지 않는데 `my_dict[key]` 를 하게 되면 에러 메시지를 보게 됩니다.

그래서 key 값이 `my_dict`에 있는지 먼저 확인하고자 아래와 같이 코드를 짜게 되는데요,

if key not in my_dict:
    my_dict[key] = []
my_dict[key].append(new_value)

나쁘지 않습니다. 저도 이렇게 주로 코딩해왔습니다.

 

그런데 훨씬 간단하게 코드를 짜는 방법이 있습니다.

my_dict.setdefault(key, []).append(new_value)

이렇게 setdefault() 를 통해 존재하지 않는 키를 처리할 수 있습니다.

 

또는,  defaultdict()를 사용하는 방법도 있습니다!

>>> from collections import defaultdict
>>> my_default_dict = defaultdict(list)
>>> for i in range(5):
>>>     my_default_dict[0].append(i+1)
>>> print(my_default_dict)
defaultdict(<class 'list'>, {0: [1, 2, 3, 4, 5]})

defaultdict를 import 해 주고 list형으로 선언해줍니다. 그러면 값이 잘 들어가죠?

만약 아래와 같이 defaultdict가 아닌 일반 dictionary 형으로 위와 같이 접근하려면

이런 에러가 발생합니다.

 

자료구조를 많이 알고 있는 게 코드를 짤 때 여러모로 도움이 되는 것 같습니다. Python에서 dictionary자료형은 많이 쓰니 잘 알고 있으면 좋을 것 같아요 :)

728x90
반응형
728x90
반응형

Python 이중 어레이 초기화

 

1. 지능형 리스트로 표현

>>> board = [['_'] * 3 for _ in range(3)]
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

>>> board[1][2] = 'X'
>>> board
[['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

 

2. 잘못된 표현

- 동일한 리스트에 대한 세 개의 참조를 가진 리스트는 잘못된 리스트입니다.

>>> wrong_board = [['_'] * 3] * 3
>>> wrong_board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

>>> wrong_board[1][2] = 'X'
>>> wrong_board
[['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

  - 즉, 이렇게 코드를 작성한다면 최상위 리스트가 동일한 내부 리스트에 대한 참조를 세 개 가지게 되어
  - 세 개의 행이 모두 동일한 객체를 참조하게 된다.

 

참고) 한빛미디어 '전문가를 위한 파이썬'

728x90
반응형
728x90
반응형

라인플러스 2019 상반기 인턴 채용 코딩테스트 

 

문제 해설 링크

 

2019년 상반기 LINE 인턴 채용 코딩테스트 문제 해설 - LINE ENGINEERING

LINE에서 개발 직군을 뽑을 때 신입이든 경력이든 가장 먼저 보는 것이 코딩 테스트입니다. LINE의 코딩 테스트는 일반적인 알고리즘 경진대회와는 경향이 조금 다른데요. 알고리즘 경진대회는 1��

engineering.linecorp.com

 

from collections import deque
def solution(conyPosition, brownPosition):
    time = 0
    visit = [[0]*2 for _ in range(200001)]
    q = deque()
    q.append((brownPosition, 0))
    
    while 1:
        conyPosition += time
        if conyPosition > 200000 or conyPosition < 0:
            return -1
        if visit[conyPosition][time%2]:
            return time
        for i in range(0, len(q)):
            current = q.popleft()
            currentPosition = current[0]
            newTime = (current[1]+1)%2
            
            newPosition = currentPosition - 1
            if newPosition >= 0 and not visit[newPosition][newTime]:
                visit[newPosition][newTime] = True
                q.append((newPosition, newTime))
            newPosition  = currentPosition + 1
            if newPosition < 200001 and not visit[newPosition][newTime]:
                visit[newPosition][newTime] = True
                q.append((newPosition, newTime))
            newPosition = currentPosition * 2
            if newPosition < 200001 and not visit[newPosition][newTime]:
                visit[newPosition][newTime] = True
                q.append((newPosition, newTime))
        time += 1
728x90
반응형
728x90
반응형

프로그래머스 연습문제

 

안녕하세요 :) 

오늘 가지고 온 문제는 카카오 인턴십 문제입니다. 

카카오 문제 치고 굉장히 쉬운 편에 속하는데요, 저는 좀 지저분하게 풀었습니다

문제 링크
 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

문제에 나온 조건에만 맞추면 되는 쉬운 문제였습니다 ㅎㅎ 아래에 바로 코드 올려요!

from collections import deque
def checkLeft(num):
    possible = ['1', '4', '7', '2', '5', '8', '0']
    if num in possible:
        return True
    return False
def checkRight(num):
    possible = ['2', '5', '8', '0', '3', '6', '9']
    if num in possible:
        return True
    return False

def solution(numbers, hand):
    answer = ''
    numbers = deque(numbers)

    pads = {'1': (0, 0), '2': (0, 1), '3': (0, 2),
            '4': (1, 0), '5': (1, 1), '6': (1, 2),
            '7': (2, 0), '8': (2, 1), '9': (2, 2),
            '*': (3, 0), '0': (3, 1), '#': (3, 2)}
    
    left = pads['*']
    right = pads['#']
    for num in numbers:
        num = str(num)
        if checkLeft(num) and not checkRight(num):
            answer  += 'L'
            left = pads[num]
        elif not checkLeft(num) and checkRight(num):
            answer += 'R'
            right = pads[num]
        elif checkLeft(num) and checkRight(num): 
            leftDist = abs(pads[num][0] - left[0]) + abs(pads[num][1] - left[1])
            rightDist = abs(pads[num][0] - right[0]) + abs(pads[num][1] - right[1])
            if leftDist < rightDist:
                answer += 'L'
                left = pads[num]
            elif rightDist < leftDist:
                answer += 'R'
                right = pads[num]
            elif rightDist == leftDist:
                if hand == 'right':
                    answer += 'R'
                    right = pads[num]
                if hand == 'left':
                    answer += 'L'
                    left = pads[num]
    return answer

좀 지저분하긴 하네요..

 

그럼 이만 ㅎㅎ

728x90
반응형
728x90
반응형

프로그래머스 문제

 

안녕하세요! 왠지 오늘은 하나 더 풀고싶어서 풀어봤습니다!

프로그래머스에서 진행한 월간코드첼린지라는 게 있더라구요. 여기서 기출한 문제입니다.

문제링크

 

이 문제도 어렵지 않았는데, 파이썬으로 풀면 정말 쉬운 문제 유형인 것 같습니다.

중복 제거용으로 set 써주었고 sort 사용하여 정렬까지 해 주었습니다.

def solution(numbers):
    answer = []
    n2 = numbers.copy()
    for i in range(len(numbers)):
        for j in range(len(numbers)):
            if i == j:
                continue
            answer.append(numbers[i] + numbers[j])
    answer = list(set(answer))
    answer.sort()
    return answer

그럼 이만~!

728x90
반응형

+ Recent posts