파이썬에서 오라클을 다루기 위해서 주로 cx_Oracle 라이브러리를 많이 사용합니다.

그리고 쿼리를 전달할 때 where 절에 한글이 들어가야 하는 경우도 있는데,

그냥 전달할 경우 한글을 인식하지 못해 제대로 된 결과 값이 안 나오는 경우가 있습니다.


# -*- coding: utf-8 -*-

import cx_Oracle

db = cx_Oracle.connect(DB접속 정보)

cursor = db.cursor()

SELECT * FROM table_name WHERE title like '%한글제목%'


위와 같이 쿼리를 전달할 경우 제대로 된 결과값이 안 나옵니다.

아래 처럼 utf-8로 decode 된 값으로 전달을 해줘야 제대로 출력되는 것을 볼 수 있습니다.


# -*- coding: utf-8 -*-

import cx_Oracle

db = cx_Oracle.connect(DB접속 정보)

cursor = db.cursor()

cusor.execute("SELECT * FROM table_name WHERE title like '%한글제목%'".decode('utf8'))

저작자 표시 비영리 변경 금지
신고

python에서 리스트는 여러모로 많이 쓰입니다.

보통 리스트에 저장된 모든 값들을 출력을 많이 하는데 중복된 값이 있다면 필요가 없겠죠.


이때 set함수를 사용합니다.

set함수는 집합과 관련된 함수로 중복제거에 사용 시 아래와 같이 사용하면 됩니다.


list1 = ['1', '3', '5', '2', '4', '1', '5']


print list(set(list1))


<결과>


하지만 set함수는 위에서 보시는 것처럼 '순서와 상관없이' 중복만 제거 합니다.


만약 순서를 유지하면서 출력을 하고 싶다면 아래 코드를 이용하시면 됩니다.


from collections import OrderedDict


list2 = ['1', '2', '3', '4', '5', '3', '5']

print list(OrderedDict.fromkeys(list2))


OrderedDict 라이브러리를 사용하여 원본 리스트가 가진 값을 순서대로 정렬 및 중복 제거를 수행합니다.


<결과>

아마 이런 식의 출력을 원하시는 분들이 더 많을 것 같습니다.


다른 언어로는 여러 줄의 코드가 필요하겠지만 파이썬으로는 한 줄이면 가능하다는 점이 많은 분들이 파이썬을 사용하는 이유가 아닐까 싶습니다.


=)

저작자 표시 비영리 변경 금지
신고


예전에는 파이썬에서 웹을 다룰 때 urllib, urllib2, beautifulsoup를 많이 사용했습니다.

알려진 웹 관련 라이브러리래봐야 저 정도가 전부였기도 하고...


요즘엔 requests라는 라이브러리를 많이 사용하고 실제로 써보니 확실히 많이 편하구요.

처음 requests를 사용한건 IP 조회 코드가 필요해서 쓰게 됬는데, 그 이후로 웹 관련 코드 작성할 때는 requests만 쓰고 있습니다.


다만 이 라이브러리에서의 문제는 간혹 한글이 깨져서 출력되는 경우가 있다는 것...

웹 페이지 인코딩 설정에 따라 다른 것 같은데 req.text로 결과값을 가져올 경우 한글이 깨지는 경우가 발생합니다.


문제 해결은 간단하게 해결했는데.. req.content로 결과값을 출력시켜주면 됩니다.

원인은 req.text는 값을 'unicode'형으로 가져옵니다.

반면, req.content는 'str'형으로 값을 가져오구요.



unicode로 값을 가져올 경우 코딩하다보면 아주 짜증나는 문자 체계덕에 좀 꼬이는 경우가 발생하는 것 같습니다.

unicode 처리할 때 종종 쓰는 codecs 라이브러리나 다른 .encode(), unicode() 등을 쓰지 않고도 requests 라이브러리 자체적으로 해결되니 진짜 잘 만들어진 라이브러리란 생각도 드네요.



참고 : http://stackoverflow.com/questions/11435331/python-requests-and-unicode

저작자 표시 비영리 변경 금지
신고

python send mail - 메일 전송 프로그램


이 프로그램이 필요하다고 생각된건 인터넷을 기가랜으로 바꾸기 전에는 집에 공인 IP 한 개만 들어와서 공유기가 꺼지지 않는 이상은 상관없었는데, 기가랜 모뎀이 생기면서 연결되는 PC, IPTV, VoIP, 무선공유기, Rasberry PI까지.. 모든 장치가 공인 IP를 받아온다.


문제는 PC나 Rasberry PI가 부팅 시마다 IP가 바뀌니 원격에서 붙기가 어려웠고, IP를 메일로 보내주는 프로그램을 생각했다.

다행히 윈도우 기반인 PC와 Linux 기반인 Rasberry PI 둘 다 Python이 먹히니 귀찮음은 덜었다.


우선, 메일을 보내기 위해서는 SMTP(Simple Mail Transfer Protocol) Server가 필요한데, 인터넷에서 간단한 SMTP 서버를 설치해도 괜찮고, 구글이나 네이버 등의 다른 SMTP를 써도 괜찮다. 다만, 이 프로그램 하나 돌리자고 SMTP Server까지 운영하면서 보안상 문제까지 떠안기는 싫어서보안 잘 하는 구글이나 네이버의 서버를 쓰기로 했다.


타 회사의 서버를 사용하기 위해서는 우선 본인 계정에서 smtp 사용 설정을 해줘야한다.

이후 작성할 python코드에 아래 정보를 입력해주면 된다.

smtp.naver.com / smtp.gmail.com

smtp 포트 : 465

ID/PW : 본인 네이버 계정


처음에는 간단히 smtplib와 email라이브러리를 이용해서 최소의 기능만 하는 프로그램을 작성했지만, 부팅 시간도 체크하기 위해 시간 관련 라이브러리를 추가해서 마무리했고 더 필요한 기능도 없어보인다.


메일 전송 결과 아래와 같이 정상적으로 전송되는 것을 확인 가능하다.



약간의 설명을 덧 붙이자면, sender에는 보내는 사람의 계정(smtp서버와 동일 계정), receiver에는 받을 계정이 들어가야하고

ID와 PW에는 보내는 사람 계정의 정보가 들어가야한다.


================

부팅 시 해당 프로그램이 실행되어야 하니 윈도우의 작업 스케줄러에 추가해주는 작업이 필요하다.

실행(Win+R) > taskschd.msc 혹은 제어판에서 작업 스케줄러를 실행한다.

좌측 메뉴 중 작업 스케줄러 라이브러리를 클릭 후 우측에서 작업 만들기로 새 작업을 만들어주면 된다.

트리거 탭에서 시작할 때 사용하는 옵션과, 동작 탭에서 실행될 프로그램만 지정해주면 간단히 끝난다.





저작자 표시 비영리 변경 금지
신고


python raw_input() 개행 없이 문자열 입력 받는 방법


python에서 raw_input()으로 입력을 받을 때 여러 줄을 복사, 붙여넣기 할 경우 아래와 같은 문제가 발생합니다.


string = raw_input()

=====

입력


string1

string2

string3


=====

출력

string1

입력은 여러 줄을 받았으나 string1 뒤의 \n으로 인해 변수에 한 줄만 입력되게 됩니다.

흔히 생각할 때는 string변수에 'string1\nstring2\nstring3\n'으로 입력될 것 같지만 

python에서 \n를 엔터로 입력받아버려 이런 문제가 발생합니다.


이를 해결하기 위해서는 2가지 방법이 있습니다.


1. import sys

2. 반복문을 사용한 raw_input()


1번의 경우 아래와 같은 코드로 입력받을 수 있습니다.

import sys


string = sys.stdin.readlines()

출력 결과

>>> 

string1

string2

string3




['string1\n', 'string2\n', 'string3\n', '\n', '\n', '\n']

sys 라이브러리를 썼을 경우 \n을 그대로 받아 변수에 저장이 가능하지만

입력을 종료하기 위해 엔터를 입력하는 것까지 \n으로 받아버리기 때문에 약간의 문제가 발생합니다.

이 경우 IDLE에서는 Ctrl+D로 종료가 가능하며, windows console에서는 Ctrl+Z로 입력 종료가 가능합니다.

둘 다 EOF(End of File)을 입력하는 방법이며, 키보드 인터럽트를 받아 공백을 입력 받았을 때 종료시키는 코드를 짜도 됩니다.



2번의 경우는 반복문을 사용하여 여러번의 raw_input()을 사용함과 동시에

append()를 사용하여 리스트 형식으로 문자열을 계속 더하는 방법입니다.

string = []

while True:

    input_data = raw_input()

    if input_data == '':

        break

    else:

        string.append(input_data)


for line in string:

    print line

출력 결과

>>> 

string1

string2

string3


string1

string2

string3

여러줄의 string1~3을 받고 엔터를 두 번 입력할 경우 결과가 출력됩니다.

1번의 경우보다 코드가 조금 더 길지만 문자열을 라인 단위로 리스트에 저장하기 때문에

좀 더 다루기가 편리한 방법입니다.

위 코드에서 print string[1]을 하면 string2가 출력되는 식입니다.


코드를 좀 더 살펴보면, while문을 통해 반복적으로 raw_input()으로 입력을 받으며,

공백이 아닌 입력된 문자열이 있을 경우 append()를 통해 string 리스트에 계속 더하게 됩니다.


입력받을 문자열에 따라 두 방법 중 편한 방법을 선택하여 사용하면 됩니다.

저작자 표시 비영리 변경 금지
신고



Python에서 continue와 pass의 차이점


우선 continue는 for문, if문 같은 곳에서 사용 시 다음 루프로 넘기는 역할을 합니다.

pass는 아무 역할 없이 단순히 코드 진행을 하게 됩니다.


아래 코드를 실행해보면 좀 더 이해가 쉽습니다.


for x in range(1, 6):

    if x:

        print "x is %d" % x

        pass

    print "Pass"


for y in range(1, 6):

    print "continue_before"

    if y:

        print "y is %d" % y

        continue

    print "continue_after"


그리고 아래 결과는 아래와 같습니다.


x is 1

Pass

x is 2

Pass

x is 3

Pass

x is 4

Pass

x is 5

Pass

continue_before

y is 1

continue_before

y is 2

continue_before

y is 3

continue_before

y is 4

continue_before

y is 5


pass를 사용한 for문에서는 pass가 있는듯, 없는듯 loop가 돌아가는 것을 볼 수 있습니다.

반면, continue를 사용한 for문에서는 continue_after가 실행되지 않고 있습니다.

즉, continue문이 실행되는 순간 다음 loop로 넘어가버리므로 실행되지 않게 됩니다.


그럼 이 쓸모없어 보이는 pass문은 어디에 쓰냐면 python에서는 에러관리를 위해 try: except: 문을 사용합니다.

이때 에러가 발생하더라도 계속 코드를 진행시키기 위해 except:문에서 pass를 사용하는 경우가 많습니다.

저작자 표시 비영리 변경 금지
신고


이전 포스팅([Language/Python] - Python shutil copytree 사용 파일 복사)에서는 shutil을 이용하여

경로 중간의 폴더가 없더라도 생성해가며 해당 경로로 파일을 복사하는 방법이었습니다.


이번 방법은 파일 복사가 아닌 중간 경로의 폴더가 존재하지 않더라도 생성해가면서 경로를 완성하는 방법입니다.

예를 들어 os.mkdir로 C:\test\test1\test2\test3라는 경로가 필요한데 test1, test2라는 중간 경로의 폴더가 없다면, 

'WindowsError: [Error 3] : '경로''에러가 발생합니다.



이 경우 os.makedirs()를 사용한다면, 경로를 따라가면서 폴더를 생성하게 됩니다.


사용 라이브러리 : os > makedirs


import os


os.makedirs("C:\\test\\test1\\test2")



저작자 표시 비영리 변경 금지
신고
  1. 2016.06.13 09:29

    비밀댓글입니다



가끔 파일 복사를 해야할 때 C:\test에 있는 모든 파일을 D:\copy\copy1\copy2로 옮기고 싶은데 \copy\copy1\copy2의 경로가 없을 때가 있습니다.

즉, 폴더가 없다면 생성해가면서 지정된 위치로 파일을 복사하는 방법입니다.


사용 라이브러리 : shutil > copytree


import shutil


shutil.copytree(src, dst, symlink=False, ignore=None)


예제 :


import shutil


shutil.copytree('C:\\srcfolder', 'D:\\dstfolder\\folder1\\folder2\\folder3')


결과 :


텍스트로 출력되는 결과가 아니라 제대로 보여드리긴 어렵지만 위 처럼 folder1,2,3이 순차적으로 생성되고,

c:\srcfolder에 있는 파일들이 모두 복사가 됩니다.


주의할 점은 폴더 경로 작성 시 백슬래시(\) 한 개가 아닌 2개(\\)를 써줘야 경로를 제대로 인식합니다.

저작자 표시 비영리 변경 금지
신고

* 개발 언어 : Python 2.7

* 개발 기간 : 2014-12-19

* 개발 목적 : 동일한 파일이 존재하는지 파일명을 변경하여 파악

* 프로그램 설명 : 지정한 폴더의 모든 파일들을 MD5 해쉬시킨 값을 파일명으로 만들어 중복파일 검사

* 버전 히스토리 :

1.0 : MD5해쉬 및 파일 이름 변경 등 기본 기능만 넣고 마무리

1.1 : 작업 완료 후 실패한 파일 목록 출력하도록 추가

1.2 : 작업위치를 절대/상대 경로로 사용자에게 입력받아 지정할 수 있도록 추가

1.3 : 변수명 알기 쉽도록 변경, 변경 작업 시 확장자 소문자로 일괄 변환

1.4 : 오류 번호를 구분하여 에러 메시지 출력

 

 

 

* 프로그램 작동 모습

1) 작업할 폴더 지정 (절대/상대 경로)

 

 

 2) 파일명 변경 모습, 에러 발생 시 원인 출력 (사진은 한 번 변경했던 파일들이라 변경 전/후가 같음)

 

 

3) 작업 완료 시 작업 결과 출력

 

 

4) 파이썬 파일을 클릭하여 바로 CMD로 실행될 때를 위해 작업 결과 출력 후 PAUSE

 

 

 

* 참고 사이트

파일 해시방법
http://joelverhagen.com/blog/2011/02/md5-hash-of-file-in-python/

 

확장자 가져오기
http://lapee79.blogspot.kr/2013/08/python-strings.html
http://yeongeon.tistory.com/58

 

os모듈 설명
http://devanix.tistory.com/304

 

예외처리
https://wikidocs.net/30

 

문자열 출력방법
http://mwultong.blogspot.com/2006/12/python-print-string-number-variable.html

 

파일 입/출력 방법
https://wikidocs.net/26

 

입력과 출력 input() / print()
https://wikidocs.net/25

파이썬 input()과 raw_input()의 차이

http://pwnbit.kr/21

 

 

 

* 제작 결과물 

File Name Hasher 1.4.py

 

나, 혹은 다른 사람이 봐도 최대한 코드 이해가 쉽도록

주석을 과도하다 싶을 정도로 넣었고, 코드도 줄여쓰는걸 자제함..

 

 

사실 다른 사람이 본다기보다 내가 나중에 까먹기 때문에 주석으로 떡칠함..

더 추가할 기능은 없을듯..

이 코드를 응용하면 일괄적으로 파일명을 바꿔야할 때 써먹을 수 있음

(즉, 쓸데 없는 프로그램)

 






저작자 표시 비영리 변경 금지
신고

+ Recent posts

티스토리 툴바