2011. 11. 22. 18:43

운영체제(OS)에서 제공되는 기본적인 기능들을 제공.

 

os.getcwd(), os.chdir(path)

 

chdir() 함수는 현재 작업 디렉터리 위치를 변경하며,

getcwd()함수는 현재 작업 디렉터리의 위치를 가져올 때 쓰입니다.

>>> getcwd()

'C:\\Python3'

>>> chdir('Tools')

>>> getcwd()

'C:\\Python3\\Tools'

 

os.access(path, mode)

 

입력받은 <path>에 대해서 <mode>에 해당하는 작업이 가능한지의 여부를 반환합니다.

 

모드(mode)

설명

F_OK

해당 path의 존재 여부를 확인

R_OK

해당 path의 읽기 가능여부 확인

W_OK

해당 path의 쓰기 가능여부 확인

X_OK

해당 path의 실행 가능여부 확인

 

>>> access('.', F_OK)    # existence

True

>>> access('.', W_OK | X_OK | R_OK) # write, exec, read

True

 

os.listdir(path)

 

해당 경로(path)에 존재하는 파일과 디렉터리들의 리스트를 반환합니다.

>>> listdir('.')

['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe',

'README.txt', 'tcl', 'Tools', 'w9xpopen.exe']

 

os.mkdir(path[, mode])

 

<path>에 해당하는 디렉터리를 생성합니다.

>>> mkdir('test1')

['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe',

'README.txt', 'tcl', 'test1', 'Tools', 'w9xpopen.exe']

 

os.makedirs(path[, mode])

 

인자로 전달된 디렉터리를 재귀적으로 생성합니다.

이미 디렉터리가 생성되어 있는 경우나 권한이 없어 생성할 수 없는 경우는 예외를 발생합니다.

>>> makedirs('test2/sub1/sub2/leaf')

>>> listdir('test2/sub1/sub2')

['leaf']

>>> makedirs('test2/sub1/sub2/leaf') # 이미 존재하는 디렉터리를 생성하는 경우 예외 발생

Traceback (most recent call last):

File "<pyshell#18>", line 1, in <module>

makedirs('test2/sub1/sub2/leaf')

File "C:\Dev\Python3\lib\os.py", line 152, in makedirs

mkdir(name, mode)

WindowsError: [Error 183] 파일이 이미 있으므로 만들 수 없습니다: 'test2/sub1/sub2/sub3'

 

os.remove(path), os.unlink(path)

 

파일을 삭제 합니다.

>>> remove('test.txt')

>>> unilnk('test.txt')

 

os.rmdir(path)

 

디렉터리를 삭제합니다. 단, 디렉터리는 비어있어야만 합니다.

>>> mkdir('test1')

 

os.removedirs(path)

 

디렉터리를 연달아 삭제합니다.

 

만약 '윈도우 탐색기'와 같은 애플리케이션으로 'sub1' 디렉터리를 보고 있다면,

removedirs() 함수로 'sub1' 디렉터리를 삭제할 수 없습니다. 탐색기를 종료하고 수행해야 합니다.

# leaf 디렉토리 삭제에 성공하면 차례로 sub2, sub1, test2의 순서로 삭제

>>> removedirs('test2/sub1/sub2/leaf')

 

os.rename(src, dst)

 

srcdst로 이름을 변경하거나 이동합니다. 파일이나 디렉터리에 대해서 모두 적용 됩니다.

>>> rename('text.txt', 'renamed.txt')

 

os.renames(src, dst)

 

srcdst로 이름을 변경하거나 이동합니다. rename과 다른점은 이동 시에 필요한 디렉터리들을

자동으로 생성한다는 것입니다.

>>> renames('renamed.txt', 'test_renames/moved.txt')

>>> listdir('test_renames')

['moved.txt']

 

os.stat(path)

 

경로에 해당하는 정보를 얻어옵니다.

아래의 예제와 같이 순차적으로 protection, inode, device, link, user id, group id, size,

last access time, last modified time, last change time 등을 나타냅니다.

(stat() 함수 결과 중 일부는 유닉스/리눅스 시스템에만 해당되는 것도 있습니다)

>>> stat('python.exe')

nt.stat_result(st_mode=33279, st_ino=281474976762468, st_dev=0, st_nlink=1, st_uid=0,

st_gid=0, st_size=26624, st_atime=1321851747, st_mtime=1315097496, st_ctime=1315097496)

 

os.utime(path, times)

 

경로에 해당하는 파일에 대해 액세스 시간(access time)과 수정 시간(modified time)을 <times>로

수정합니다. <times>가 None일 경우는 현재 시간으로 수정합니다. (유닉스의 touch 명령어와 유사)

>>> stat('readme.txt')

nt.stat_result(st_mode=33206, st_ino=281474976762465, st_dev=0, st_nlink=1, st_uid=0,

st_gid=0, st_size=6788, st_atime=1321797957, st_mtime=1315094610, st_ctime=1315094610)

>>> utime('readme.txt', None)

>>> stat('readme.txt')

nt.stat_result(st_mode=33206, st_ino=281474976762465, st_dev=0, st_nlink=1, st_uid=0,

st_gid=0, st_size=6788, st_atime=1321950244, st_mtime=1321950244, st_ctime=1315094610)

 

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

 

top으로 지정된 디렉터리를 순회하며 경로, 디렉터리명을 순차적으로 반환합니다.

# 다음의 구조로 test_walk, a, b 디렉터리를 만들어 놓고 walk를 실행

 

>>> for path,dirs,files in walk('test_walk'):

    print(path, dirs, files)

    

test_walk ['a', 'b'] []

test_walk\a [] []

test_walk\b [] ['readme.txt']

 

# topdown이 False로 설정된 경우에는 다음과 같이 디렉터리의 끝에서부터 위로 탐색

>>> for path,dirs,files in walk('test_walk', topdown=False):

    print(path, dirs, files)

    

test_walk\a [] []

test_walk\b [] ['readme.txt']

test_walk ['a', 'b'] []

 

os.umask(mask)

 

umask를 설정합니다. 수행하면 이전 mask 값이 반환됩니다. umask가 수행되면

이후 오픈 되는 파일이나 디렉터리에 (mode & ~umask)와 같이 적용됩니다.

 

os.pipe()

 

파이프를 생성합니다. 함수를 실행하면 읽기, 쓰기 전용 파이프의 파일 디스크립터가 반환됩니다.

 

(※ 파이프(pipe)란 프로세스 간 통신을 위한 공유 영역입니다. 여러 프로세스 간에 정보를 주고 받기

위해 만들어지는 공간이며, 하나의 프로세스가 정보를 쓰면 다른 프로세스에서 읽을 수 있습니다)

>>> pipe()

(3, 4)

 

os.fdopen(fd[, mode[, bufsize]])

 

파일 디스크립터를 이용해 파일 객체를 생성합니다.

 

(※ fdopen은 'from os import *'로 import가 안됩니다.

fdopen의 경우 'from os import fdopen'으로 따로 import 해주어야 합니다)

>>> from os import *

>>> from os import fdopen

 

>>> r,w = pipe()

>>> rd = fdopen(r)

>>> rd

<_io.TextIOWrapper name=3 mode='r' encoding='cp949'>

 

os.popen(command[, mode[, bufsize]])

 

인자로 전달된 command를 수행하며 파이프를 엽니다.

(파이썬3 에서는 Popen 클래스의 사용을 권장하지만 그대로 사용할 수도 있습니다)

 

(※ popen은 'from os import *'로 import가 안됩니다. popen의 경우 'from os import popen'으로

import하거나 import os 후 os.popen으로 사용해야 합니다)

>>> from os import popen

 

>>> p = popen('dir', 'r')

>>> p.read()

...<중략>...

2011-09-04 오전 09:51 26,624 python.exe\n

2011-09-04 오전 09:51 27,136 pythonw.exe\n

2011-11-22 오후 05:24 6,788 README.txt\n

2011-11-20 오후 11:06 <DIR> tcl\n

2011-11-20 오후 11:05 <DIR> Tools\n

2011-09-04 오전 09:51 49,664 w9xpopen.exe\n

6개 파일 396,879 바이트\n

9개 디렉터리 72,007,368,704 바이트 남음\n'

 

os.name

 

파이썬이 실행되는 운영체제의 이름을 나타냅니다. (ex: 'nt', 'posix', 'mac'등...)

>>> name

'nt'

 

os.environ

 

환경변수들을 나타내는 사전입니다.

>>> environ

environ({'TMP': 'C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp',

'COMPUTERNAME': 'WIN2003', 'USERDOMAIN': 'WIN2003',

'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', ...<중략>...})

>>> environ['OS']

'Windows_NT'

>>> environ['userprofile']

'C:\\Documents and Settings\\Administrator'

 

os.getpid()

 

현재 프로세스 아이디를 반환합니다.

>>> getpid()

3380

 

os.getenv(varname[, value])

 

환경 변수의 값을 얻어 옵니다. 다만 해당 환경 변수가 없을 경우에는 인자로 전달된 <value>값을

반환합니다. value가 생략되고 해당 환경 변수가 없으면 None을 반환 합니다.

>>> getenv('homepath')

'\\Documents and Settings\\Administrator'

>>> getenv('test', '')

''

 

os.putenv(varname, value)

 

환경변수 <varname>을 <value>로 설정합니다. 자식 프로세스에게 영향을 미칩니다.

>>> putenv('test', '\\tmp\\test')

 

# 자식 프로세스에게 영향을 미치므로, putenv()의 결과 확인.

>>> from os import popen

>>> p = popen('''python -c "import os; print(os.getenv('test'))"''', 'r')

>>> p.read()

'\\tmp\\test\n'

 

os.strerror(code)

 

에러 코드에 해당하는 에러 메시지를 보여줍니다.

>>> for i in range(0, 44):

print (i, strerror(i))

 

0 No error

1 Operation not permitted

2 No such file or directory

3 No such process

4 Interrupted function call

5 Input/output error

6 No such device or address

7 Arg list too long

8 Exec format error

9 Bad file descriptor

10 No child processes

...<중략>...

 

os.system(command)

 

<command>를 실행하며, 성공한 경우 0을 반환합니다.

[계산기 실행화면]

 

os.startfile(path[, operation])

 

<path>를 os에서 지정된 프로그램으로 실행합니다.

또한 <operation>으로 명시적으로 수행할 프로그램을 지정할 수 있습니다.

 

(※ starfile('LICENSE.txt')의 경우 system("Notepad LICENSE.txt')와 유사하지만 system()을 사용하는

경우에는 파이썬 프로그램의 실행이 잠시 멈추고 system()이 끝나길 기다리게 되고, startfile()은

멈추지 않고 계속 실행됩니다.)

 

os.execl(path, arg0, arg1, ...)

os.execle(path, arg0, arg1, ..., env)

os.execlp(file, arg0, arg1, ...)

os.execlpe(file, arg0, arg1, ..., env)

os.execv(path, args)

os.execve(path, args, env)

os.execvp(file, args)

os.execvpe(file, args, env)

 

위의 함수는 현재 프로세스에서 새로운 프로그램을 수행시키며 리턴은 하지 않습니다.

인자에 따라 여러 가지 exec로 나뉘어지는데, 우선'l'이 붙은 것들은 입력인자들의 수가 정해져

있는 경우이고, 'v'가 붙은 것들은 args라는 튜플로 입력인자를 받습니다. 'e'가 붙은 경우는

환경변수 env를 받느냔 아니냐의 차이이며, 'p'는 환경변수의 path를 이용하는 경우입니다.

>>> execl('C:\\Python3\python', 'python', '-v')

>>> execv('python', ('python', '-v'))

>>> execle('C:\Python3\python', 'python', '-v', {"HOME":"C:\\"})

'Programming > Python' 카테고리의 다른 글

파이썬 – 날짜시간(datetime) 모듈  (0) 2011.11.26
파이썬 – 시간(time) 모듈  (1) 2011.11.26
파이썬 – sys 모듈  (0) 2011.11.21
파이썬 – os.glob 모듈  (0) 2011.11.20
파이썬 – os.path 모듈  (2) 2011.11.20
Posted by devanix
2011. 11. 21. 17:36

[ Problem ]

http://huge:file@www.pythonchallenge.com/pc/return/uzi.html

§ 그림에 1월 26에 표시된 달력이 보입니다.

하지만 년도는 구멍이 나있어 정확한 년도는 보이지 않고 1xx6년 이라는 추측만 할수 있습니다.

또한 우측하단에 12월과 2월이 보이는데 정확한 숫자는 알수 없으나 2월에 29칸에 차있으므로,

이해는 윤년(leap year)임을 짐작할 수 있습니다.

 

즉, 1xx6년 1월 26일이 월요일 이며 윤년인 해로 요약할 수 있습니다

그럼 해당하는 해를 찾아 봅시다.

 

♧ 필요 메소드

 

calendar.isleap(year)

- 해당 년도가 윤년(leapyear)인지 판별 합니다.

calendar.weekday(year, month, day)

- year(1970-...), month(1-12), day(1-31)에 해당하는 요일을 반환합니다.

- 해당 요일은 월요일(0) ~ 일요일(6)로 0~6까지 'int'형을 반환.

 

♧ Source

 

[출력 결과]

 

출력결과를 보면 5개의 년도가 출력 되었다.(1176, 1356, 1576, 1756, 1976)

해당 HTML 페이지 소스에서 실마리를 찾아보자.

 

§ HTML 페이지 소스에서 힌트 찾기

 

힌트를 주석을 보면...

<!-- he ain't the youngest, he is the second -->

- 그는 최연소가 아니며 두 번째 이다?

즉 해당 년도중 가장 작은수가 아니고 끝에서 두번째인 1756년.

<!-- todo: buy flowers for tomorrow -->

- 내일을 위해 꽃을 사라? (내일... 27일)

 

해당 결과와 힌트를 조합해 보면 1756년 1월 27일이 된다.

▷ 검색해 보면 모차르트(mozart) 탄생일 이라는것을 알수 있다.

 

next challenge : mozart.html

[ Solution ]

http://huge:file@www.pythonchallenge.com/pcc/return/mozart.html

 

Posted by devanix
2011. 11. 21. 13:33

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/italy.html

♧ 타이틀은 walk around 이고 빵 한 개와 바코드와 비슷하게 보이는 사진이 있다.

   

▷ 소스를 보자!

   

▷ 소스를 보면 'italy.jpg'는 빵 사진이고 'wire.png'는 바코드처럼 보이는 사진이다.

'wire.png'를 클릭해보면 '10000 x 1 pixels' 이라 아무것도 보이지 않는데

이것을 잠시 size를 '100 x 100'로 바꿔 보면 (크롬의 개발자 모드)

메인과 같은 바코드와 같은 그림이 보이는 것을 알 수 있다.

   

위에 소스에서 remember 주석을 참조해 보면 아래의 그림과 같이

바깥에서 부터 100+99+99+98+98+97...과 같이 2회당 1씩 감소한다.

즉, 위의 바코드 이미지를 아래와 같이 Pixel값을 회전하면서 재배치 한다.

   

w 이를 바탕으로 소스를 짜보면 다음과 같습니다.

   

[결과 이미지]

[ 'cat.html' 접속 화면 ]

   

▷ 마지막으로 'uzi.html' 접속하면 끝.

   

[ Solution ] - http://huge:file@www.pythonchallenge.com/pcc/return/uzi.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 11. 21. 01:13

sys모듈은 파이썬 인터프리터와 관련된 정보와 기능을 제공하는 모듈이다.

 

sys.argv

 

파이썬 스크립트로 넘어온 입력인자(argument)들의 리스트.

- 아래 예제와 같이 0번째는 스크립트 이름이 있으며, 그 이후부터 인자들이 설정

[ test_argv.py 예제코드 ]

import sys

print("argv size :", len(sys.argv))

for i, arg in enumerate(sys.argv):

        print(i, arg)

 

[ 실행 결과 ]

>test_argv.py arg1

argv size : 2

0 C:\Python30\test_argv.py

1 arg1

 

 

sys.exc_info()

 

현재 발생한 예외정보를 튜플로 반환 (예외가 없는 경우 None을 반환)

[ 예외가 없는 경우 ]

>>> import sys

>>> sys.exc_info()

(None, None, None)

 

[ 예외가 발생한 경우 ]

>>> try:

    1/0

except:

    exc_class, val, tb_ob = sys.exc_info()

    print(exc_class)

    print(val)

    print(tb_ob)

    print(dir(tb_ob))

    print(tb_ob.tb_lineno)

 

    

<class 'ZeroDivisionError'>

division by zero

<traceback object at 0x00FFAAF8>

['tb_frame', 'tb_lasti', 'tb_lineno', 'tb_next']

2

 

 

sys.prefix, sys.exec_prefix, sys.executable

 

파이썬이 설치된 경로와 실행파일을 나타냅니다.

>>> sys.prefix # 파이썬이 설치된 경로

'C:\\Python3'

 

>>> sys.exec_prefix

'C:\\Python3'

 

>>> sys.executable # 파이썬 인터프리터의 실행파일 경로

'C:\\Python3\\pythonw.exe'

 

sys.exit([arg])

 

프로세스를 종료시킵니다. (arg가 0인 경우에는 정상 종료되며, 0이 아닌 경우에는 비정상종료 처리)

 

sys.getrefcount(object)

 

객체의 참조 카운트 값을 반환합니다.

일반적으로 이 값은 임시객체가 참조하는 경우도 포함되어서 1보다 크다.

>>> t = "test refcount"

>>> sys.getrefcount(t)

2

>>> t1 = t

>>> sys.getrefcount(t)

3

 

sys.getwindowsversion()

 

현재 윈도우의 버전을 튜플로 반환.

>>> sys.getwindowsversion()

sys.getwindowsversion(major=5, minor=2, build=3790, platform=2, service_pack='Service Pack 2')

 

sys.modules

 

현재 로딩되어있는 모듈들을 사전 형태로 나타냅니다.

>>> sys.modules

{'heapq': <module 'heapq' from 'C:\Python3\lib\heapq.py'>, 'tkinter.filedialog':

<module 'tkinter.filedialog' from 'C:\Python3\lib\tkinter\filedialog.py'>, 'functools':

<module 'functools' from 'C:\Python3\lib\functools.py'>, 'random': <module

'random' from 'C:\Python3\lib\random.py'>, ...<생략>...

 

sys.path

 

모듈을 찾을 때 참조하는 경로를 나타냅니다.

>>> sys.path

['C:\\Python3\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python32.zip',

'C:\\Python3\\DLLs', 'C:\\Python3\\lib', 'C:\\Python3', 'C:\\Python3\\lib\\site-packages']

 

sys.copyright, sys.version

 

설치된 파이썬의 저작권, 버전을 나타냅니다.

>>> sys.copyright

'Copyright (c) 2001-2011 Python Software Foundation.\nAll Rights Reserved.\n\nCopyright

(c) 2000 BeOpen.com.\nAll Rights Reserved.\n\nCopyright (c) 1995-2001 Corporation for

National Research Initiatives.\nAll Rights Reserved.\n\nCopyright (c) 1991-1995

Stichting Mathematisch Centrum, Amsterdam.\nAll Rights Reserved.'

 

>>> sys.version

'3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)]'

 

sys.getdefaultencoding()

 

현재 사용중인 기본 문자열 인코딩을 반환합니다.

>>> sys.getdefaultencoding()

'utf-8'

 

sys.stdin, sys.stdout, sys.stderr

 

표준 입력, 출력, 에러 스트림에 대응되는 파일 객체들을 나타냅니다.

>>> sys.stdout.write("hi python") # 표준 출력 스트림

hi python

>>> sys.stderr.write("hi python") # 표준 에러 스트림

hi python

 

'Programming > Python' 카테고리의 다른 글

파이썬 – 시간(time) 모듈  (1) 2011.11.26
파이썬 – os 모듈  (2) 2011.11.22
파이썬 – os.glob 모듈  (0) 2011.11.20
파이썬 – os.path 모듈  (2) 2011.11.20
파이썬 – 정규식표현식(Regular Expression) 모듈  (8) 2011.11.20
Posted by devanix
2011. 11. 20. 23:07

glob 모듈은 윈도우의 dir 명령어나 리눅스의 ls 명령어와 유사한 기능을 제공합니다.

 

glob.glob(path)

 

glob() 함수는 경로에 대응되는 모든 파일 및 디렉터리의 리스트를 반환합니다.

'*''?'도 사용가능하며 "[""]"를 사용한 문자열 비교도 가능합니다.

>>> glob.glob('*')

['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'tcl', 'Tools', 'w9xpopen.exe']

>>> glob.glob('./[0-9].*')

['./1.gif', './2.txt']

>>> glob.glob('*.gif')

['1.gif', 'card.gif']

>>> glob.glob('?.gif')

['1.gif']

>>> glob.glob('*.exe')

['python.exe', 'pythonw.exe', 'w9xpopen.exe']

>>> from os.path import *

>>> glob.glob(abspath('.' + '\\*.exe'))

['C:\\Python30\\python.exe', 'C:\\Python30\\pythonw.exe', 'C:\\Python30\\w9xpopen.exe']

 

glob.iglob(path)

 

glob과 동일한 동작을 수행하지만, 리스트로 결과를 반환하는 것이 아니라 이터레이터를 반환.

한번에 모든 결과를 리스트에 담지 않으므로, 결과가 매우 많은 경우 유용하게 쓰일 수 있다.

>>> glob.iglob('*')

<generator object iglob at 0x012230D0>

>>> for i in glob.iglob('*'):

    print (i)

 

    

DLLs

Doc

include

Lib

libs

LICENSE.txt

NEWS.txt

python.exe

pythonw.exe

README.txt

tcl

Tools

w9xpopen.exe

 

 

[ Example ] - Tree 예제

w tree는 하위 디렉터리 구조를 보여 주는 툴입니다.

os.pathglob의 일부 기능을 이용해서 tree와 비슷한 기능을 수행하는 예제 작성.

 

[ tree.py 소스코드 ]

 

[ 실행결과 ]

 

Posted by devanix
2011. 11. 20. 21:17

os.path는 파일 경로를 생성 및 수정하고, 파일 정보를 쉽게 다룰 수 있게 해주는 모듈.

 

os.path.abspath(path)

 

현재 경로를 Prefix로 하여 입력받은 경로를 절대경로로 바꿔서 반환합니다.

>>> abspath('tmp')

'C:\\Python30\\tmp'

 

os.path.basename(path)

 

입력받은 경로의 기본 이름(base name)을 반환합니다.

abspath() 함수와 반대되는 기능을 수행한다고 볼 수 있습니다.

>>> basename('C:\\Python30\\tmp')

'tmp'

>>> basename('C:\\Python30\\tmp\\test.txt')

'test.txt'

 

os.path.commonprefix(path_list)

 

입력받은 path_list로부터 공통적인 Prefix를 추출해서 반환합니다. 그러나 이 결과는 문자열 연산에

의한 것이기 때문에 다음의 두 번째 예제와 같이 잘못된 경로가 나올 수도 있습니다.

>>> commonprefix(['C:\\Python30\\Lib', 'C:\\Python30', 'C:\\Python30\\Tools'])

'C:\\Python30'

>>> commonprefix(['C:\\Python26\\Lib', 'C:\\Python25\\Tools'])

'C:\\Python2'

 

os.path.dirname(path)

 

입력받은 파일/디렉터리의 경로를 반환합니다.

>>> dirname('C:\\Python30\\tmp\\test.txt')

'C:\\Python30\\tmp'

>>> dirname('C:\\Python30\\tmp')

'C:\\Python30'

 

os.path.exists(path)

 

입력받은 경로가 존재하면 True를 반환하고, 존재하지 않는 경우는 False를 반환합니다.

리눅스와 같은 OS에서는 파일이나 디렉터리가 존재하지만 읽기 권한이 없는 경우에도,

False를 반환할 수 있습니다.

>>> exists('C:\\Python30')

True

>>> exists('C:\\Python30\\Devanix')

False

 

os.path.expanduser(path)

 

입력받은 경로안의 "~"를 현재 사용자 디렉터리의 절대경로로 대체합니다.

"~"에 붙여서 <사용자명>을 붙이면 원하는 사용자 경로로 대체됩니다.

(유닉스/리눅스의 홈디렉터리를 나타내는 '~'과 동일합니다)

>>> expanduser('~\\devanix')

'C:\\Documents and Settings\\Administrator\\devanix'

 

os.path.expandvars(path)

 

path안에 환경변수가 있따면 확장합니다. (환경변수는 os.environ에 정의된 것을 참조)

>>> expandvars('$HOME\\temp')

'C:\\Documents and Settings\\Administrator\\temp'

>>> expandvars('$SYSTEMROOT\\var')

'C:\\WINDOWS\\var'

 

os.path.getatime(path)

 

입력받은 경로에 대한 최근 접근 시간을 반환 (반환되는 값은 epoch(1970년 1월 1일) 이후

초단위로 반환됩니다. 파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getatime('C:\\Python30\\python.exe')

1320966393.375

# 읽을 수 있는 형식으로 보려면 다음과 같이 하면 됩니다.

>>> import time

>>> time.gmtime(getatime('C:\\Python30\\python.exe'))

time.struct_time(tm_year=2011, tm_mon=11, tm_mday=10, tm_hour=23, tm_min=6, tm_sec=33, tm_wday=3, tm_yday=314, tm_isdst=0)

 

os.path.getmtime(path)

 

입력받은 경로에 대한 최근 변경 시간을 반환 (파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getmtime('C:\\Python30\\python.exe')

1320966397.453125

 

os.path.getctime(path)

 

입력받은 경로에 대한 생성시간을 반환 (유닉스와 같은 운영체제에서는 생성시간이 아닌

최근 변경 시간을 반환할 수도 있습니다. 파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getctime('C:\\Python30\\python.exe')

1320966393.0625    

 

os.path.getsize(path)

 

입력받은 경로에 대한 바이트 단위의 파일크기를 반환.

(파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getsize('C:\\Python30\\python.exe')

26624L

 

os.path.isabs(path)

 

경로가 절대경로이면 True를 반환하고, 그 외의 경우에는 False를 반환.

(실제 해당 경로를 검사하지는 않으며 입력받은 문자열을 가지고 판단합니다.)

>>> isabs('C:\\Python30\\python.exe')

True

 

os.path.isfile(path)

 

경로가 파일인지 아닌지 검사합니다. 파일인 경우에는 True를 반환하고, 그 외의 경우 False를 반환.

(혹은 해당 경로가 존재하지 않은 경우에는 False를 반환합니다)

>>> isfile('C:\\Python30\\python.exe')

True

>>> isfile('C:\\Python26\\python.exe')

False

 

os.path.isdir(path)

 

경로가 디렉터리인지 아닌지 검사합니다. 디렉터리인 경우에는 True를 반환하고, 그 외의 경우에는

False를 반환합니다. 혹은 경로가 존재하지 않은 경우에는 False 반환합니다.

>>> isdir('C:\\Python30\\python.exe')

False

>>> isfile('C:\\Python30\\Lib')

True

 

os.path.join(path1[,path2[,...]])

 

해당 OS 형식에 맞도록 입력 받은 경로를 연결합니다. (입력 중간에 절대경로가 나오면 이전에

취합된 경로는 제거하고 다시 연결합니다)

>>> join('C:\\Python30', 'Script', 'test.py')

'C:\\Python30\\Script\\test.py'

>>> join('C:\\Python30', 'D:\\Test', 'test.py')

'D:\\Test\\test.py'

 

os.path.normcase(path)

 

해당 OS에 맞도록 입력 받은 경로의 문자열을 정규화 합니다. (윈도우와 같은 경우,

아래 예제와 같이 소문자로 바꾸고 '/''\\'로 변경합니다)

>>> normcase('C:\\Python30\\python.exe')

'c:\\python30\\python.exe'

>>> normcase('C:/Python30/python.exe')

'c:\\python30\\python.exe'

 

os.path.normpath(path)

 

입력 받은 경로를 정규화합니다. (현재 디렉터리(".")나 상위 디렉터리("..")와 같은 구분자를 최대한 삭제)

>>> normpath('C:\\Python30/./python.exe')

'C:\\Python30\\python.exe'

>>> normpath('C:\\Python30/./../python.exe')

'C:\\python.exe'

 

os.path.split(path)

 

입력 받은 경로를 디렉터리 부분파일 부분으로 나눕니다.

단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

>>> split('C:\\Python30\\python.exe')

('C:\\Python30', 'python.exe')

 

os.path.splitdrive(path)

 

입력 받은 경로를 드라이브 부분과 나머지 부분으로 나눕니다.

단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

>>> splitdrive('C:\\Python30\\python.exe')

('C:', '\\Python30\\python.exe')

 

os.path.splitext(path)

 

입력 받은 경로를 확장자 부분과 그 외의 부분으로 나눕니다.

단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

>>> splitext('C:\\Python30\\python.exe')

('C:\\Python30\\python', '.exe')

 

※ (다음 예제 코드는 from os.path import *를 하고 나서 실행)

Posted by devanix
2011. 11. 20. 16:42

[ 반복 메타 문자 ]

[메타 문자]

[의미]

*

0회 이상 반복

+

1회 이상 반복

?

0회 or 1회

{m}

m회 반복

{m, n}

m회부터 n회까지 반복

 

[ 매칭 메타 문자 ]

[메타 문자]

[의미]

.

줄바꿈 문자를 제외한 모든 문자와 매치됨

^

문자열의 시작과 매치됨

$

문자열의 마지막과 매치됨

[ ]

문자 집합 중 한 문자를 의미

|

또는(or)를 의미

{ }

정규식을 그룹으로 묶음

 

[ 이스케이프 기호 ]

[종류]

[설명]

\\

역슬래쉬 문자 자체

\d

모든 숫자와 매치됨 [0-9]

\D

숫자가 아닌 문자와 매치됨 [^0-9]

\s

화이트 스페이스 문자와 매치됨 [ \t\n\r\f\v]

\S

화이트 스페이스가 아닌 것과 매치됨 [^ \t\n\r\f\v]

\w

숫자 또는 문자와 매치됨 [a-zA-Z0-9_]

\W

숫자 또는 문자가 아닌 것과 매치됨 [^a-zA-Z0-9_]

\b

단어의 경계를 나타냄. 단어는 영문자 혹은 숫자의 연속 문자열

\B

단어의 경계가 아님을 나타냄

\A

문자열의 처음에만 일치

\Z

문자열의 끝에만 일치

 

[ 최소 매칭을 위한 정규식 ]

[기회]

[의미]

*?

*와 같으나 문자열을 취소로 매치함

+?

+와 같으나 문자열을 취소로 매치함

??

?와 같으나 문자열을 최소로 매치함

{m,n}?

{m,n}과 같으나 문자열을 최소로 매치함

 

[ 정규 표현식에서 사용 가능한 플래그 ]

[플래그]

[내용]

I, IGNORECATE

대, 소문자를 구별하지 않는다

L, LOCATE

\w, \W, \b, \B를 현재의 로케일에 영향을 받게 한다

M, MULTILINE

^가 문자열의 맨 처음, 각 라인의 맨 처음과 매치 된다

$는 문자열의 맨 끝, 각 라인의 맨 끝과 매치

S, DOTALL

.을 줄바꾸기 문자도 포함하여 매치하게 한다

U, UNICODE

\w, \W, \b, \B가 유니코드 문자 특성에 의존하게 한다

X, VERBOSE

정규식 안의 공백은 무시된다

 

[ re모듈의 주요 메소드 ]

[메소드]

[설명]

compile(pattern[, flags])

pattern을 컴파일하여 정규식 객체를 반환

match(pattern, string[,flags])

string의 시작부분부터 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

search(pattern, string[,flags])

string의 전체에 대해서 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

split(pattern, string[, maxplit=0])

pattern을 구분자로 string을 분리하여 리스트로 반환

findall(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 리스트로 반환

finditer(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 반복자로 반환

sub(pattern, repl, string[, count=0])

string에서 pattern과 일치하는 부분에 대하여

repl로 교체하여 결과 문자열을 반환

subn(pattern, repl, string[, count=0])

sub와 동일하나, 결과로(결과문자열, 매칭횟수)를

튜플로 반환

escape(string)

영문자 숫자가 아닌 문자들을 백슬래쉬 처리해서 리턴.

(임의의 문자열을 정규식 패턴으로 사용할 경우 유용)

 

[ Match 객체 ]

Match객체는 match(), search()의 수행 결과로 생성되며, 검색된 결과를 효율적으로 처리할 수 있는 기능 제공.

◎ Match객체가 지원하는 메소드와 속성

[메소드]

[속성]

group([group1, ...])

입력받은 인덱스에 해당하는 매칭된 문자열 결과의 부분 집합을 반환합니다.

인덱스가 '0'이거나 입력되지 않은 경우 전체 매칭 문자열을 반환합니다.

groups()

매칭된 결과를 튜플 형태로 반환

groupdict()

이름이 붙여진 매칭 결과를 사전 형태로 반환

start([group])

매칭된 결과 문자열의 시작 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 시작 인덱스를 반환)

end([group])

매칭된 결과 문자열의 종료 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 종료 인덱스를 반환)

pos

원본 문자열에서 검색을 시작하는 위치입니다.

endpos

원본 문자열에서 검색을 종료하는 위치입니다.

lastindex

매칭된 결과 집합에서 마지막 인덱스 번호를 반환. (일치된 결과가 없는 경우

에는 None을 반환)

lastgroup

매칭된 결과 집합에서 마지막으로 일치한 이름을 반환. (정규식의 매칭 조건에

이름이 지정되지 않았거나 일치된 결과가 없는 경우 None 반환)

string

매칭의 대상이 되는 원본 문자열입니다.

 

 

[ 예제 ] - re 모듈 함수

▶ re.match()와 re.search()의 차이

re.match()의 경우 대상 문자열의 시작부터 검색을 하지만,

re.search()함수는 대상 문자열 전체에 대해서 검색을 수행한다.

예) 아래와 같이 검색의 대상이 되는 문자열에 공백이 있는 경우나 또는

검색 키워드와 일치하는 문자열이 대상 문자열의 중간 이후에 존재하는 경우

re.match()함수는 검색을 못함.

 

▶ re.split() - 대상 문자열을 입력된 패턴을 구분자로 하여 분리

 

▶ re.findall() - 검색 문자열에서 패턴과 매칭되는 모든 경우를 찾아 리스트로 반환

 

▶ re.sub() - 패턴과 일치하는 문자열 변경

또한 변경할 문자열에 대해서 매칭된 문자열을 사용할 수도 있다.

 

 

[ 예제 ] - 정규 표현식 객체

▶ 동일한 패턴을 연속적으로 검색하는 경우, 정규식을 컴파일하여 정규표현식 객체를 생성.

 

▶ re.IGNORECASE 플래그로 대소문자 구분하지 않고 매칭 작업 수행

 

▶ re.MULTILINE 플래그를 설정하여 빈 라인을 제외하고 라인별로 분리

 

 

[ 예제 ] - Match 객체

▶ 일반적인 형식의 전화번호를 인삭하여 Match 객체가 지원하는 메소드 분석.

 

▶ 정규식 작성시 '(?<이름>..)' 형식으로 매칭 결과에 대해 이름을 부여하고,

groupdict() 메서드를 이용하여 사전 형태로 이름과 검색된 문자쌍을 얻음.

 

 

    

로우 문자열 표기법 (Raw string notation)

이스케이프 문자열을 표현하기 위하여 '\'(백슬래쉬)문자를 사용하기 때문에, 문자 '\'를 정규표현식

으로 표현하기 위해서는 '\\\\'로, 일반 문자열에선느 '\\'로 표현해야 합니다. 그래서 '\apple'이란

문자열을 검색하기 위해서는 아래와 같이 매우 복잡한 형식으로 표현해야 합니다.

 

 

로우 문자열 표기법은 문자열 앞에 'r'을 더한 것으로, \(백슬래쉬) 문자를 이스케이프 문자열로 처리

하지 않고 일반 문자와 동일하게 처리합니다. 이렇게 함으로써 정규표현식 및 문자열에서 '\'를 간단

하게 표현할 수 있습니다. 일반적으로 정규표현식에 사용되는 문자열에서는 이러한 편리함 때문에

많이 사용합니다.

 

 

Posted by devanix
2011. 11. 3. 00:52

#include <stdlib.h>

/* _exit(2) */

void _exit(int status);

return: 없음

#include <unistd.h>

/* exit(3) */

void exit(int status);

return: 없음

#include <stdlib.h>

/* exit(3) */

int atexit(void (*function)(void));

 

return: 성공 0, 실패 -1

◎  _exit()는 호출 프로세스를 "즉시" 종료합니다.

프로세스에 속한 열린 파일 디스크립터들이 모두 닫히고, 프로세스의 자식들은

프로세스 1번인 init프로세스 에게 승계하며 프로세스 부모에게는 SIGCHLD 시그널이 갑니다.

값 status을 부모 프로세스에게 프로세스의 종료 상태로 반환합니다.

(함수 _Exit()는 _exit()과 동등함)

 

 exit()는 일종의 라이브러리로 먼저 표준 입출력 라이브러리들에서 사용한 버퍼를 모두 방출(flush)

시키고 atexit()에서 등록시킨 exit 핸들러들을 모두 실행시킨후 _exit()를 호출하게 된다.

(main()에서의 return()은 exit()와 동등함)

 

C 표준에서는 두 상수 EXIT_SUCCESS와 EXIT_FAILURE를 명세하고 있는데,

이를 exit()에게 전달해서 각각 성공적인 종료과 성공적이지 못한 종료를 나타낼 수 있습니다.

 

 atexit() 함수는 exit(3)이나 프로그램 main()에서의 반환을 통한 정상적 프로세스 종료시 주어진

함수 function을 호출하도록 등록합니다. 그렇게 등록한 함수들은 등록 역순으로 호출하며 아무

인자도 전달하지 않습니다.

 (같은 함수를 여러 번 등록하는 것도 가능. 각 등록마다 한 번씩 호출)

   

POSIX.1-2001에서는 구현체가 적어도 ATEXIT_MAX (32)개까지의 함수 등록을 허용해야 한다고 요구

하고 있습니다. 구현체가 지원하는 실제 제한치는 sysconf(3)를 이용해 얻을 수 있습니다.

   

fork(2)를 통해 자식 프로세스가 생기면 부모의 등록 함수들 사본을 물려받습니다.

exec(3)군 함수 중 하나의 호출이 성공하면 등록 항목 모두가 지워집니다.

 

(exit 핸들러란, 프로그램 종료 시에 실행시킬 일종의 작업을 일컫는 것으로 atexit()에 의해 등록)

Posted by devanix