와 글이 날아갔다. 다시 쓴다. os는 Python에 내장되어있는 모듈 중 하나로, 저수준의 파일과 디렉터리 작업을 지원한다.(고수준의 기능과 확장성, 이식성이 필요하다면 shutil이라는 더 적합한 모듈이 있다.)

옛날 Latte에는 DOS OS를 이용한 window를 사용을 했다.(그 때의 Window는 이런 이쁘장한 화면 없었다~ 이 말이야)

검은 화면에 글자로 상호작용하는, 지금으로 치면 cmd명령프롬포트가 사용자와의 인터페이스 역할을 해주었다. os는 python수준에서 컴퓨터의 파일 시스템과 파일에 접근 / 처리를 지시할 수 있는 Python수준의 기능을 제공한다. 그러면 바로 만나보자



* 이 모듈탐구시간에는 WINDOW에서 사용되는 os모듈 함수들만을 다룬다 *
* 파일디스크립터 함수는 나도 잘 모르는 것이라 제대로 된 이해를 하기 전까지 정리하지 않을 것이다 *



환경변수 관련 함수

1. os.environ() : 문자열로 환경변수를 반환한다.
2. os.environb() : 바이트로 환경변수를 반환한다.
3. os.getenv(key) : key에 해당하는 환경변수 value를 반환한다. 두 번째 파라미터로 default=None을 넣을 수 있는데, KeyError시 default값을 반환한다.
4. os.getenvb(key) : key에 해당하는 환경변수 value를 바이트로 반환한다. 역시 두 번째 파라미터로 default=None을 넣을 수 있다.
5. os.putenv(key,value) : key에 해당하는 환경변수 value를 추가한다.
* 환경변수란 시스템에 전역으로 정의된 변수를 의미한다. 예를 들면 명령프롬포트에 notepad.exe(System32 폴더 아래)를 쳐서 현재 디렉터리에 없는 notepad.exe를 실행할 수 있는 이유는 기본적으로 탐색할 디렉터리인 PATH라는 환경변수에 C:\Windows\System32가 추가되어있기 때문이다.

 

 


호스트 정보 알아내기

1. os.getlogin() : 현재 로그인한 사용자의 이름을 반환한다.
2. os.cpu_count() : 시스템의 CPU수를 반환한다. 없으면 None을 반환한다.(응? 없을 수 있나?)

 

 


디렉터리 탐색

1. os.getcwd() : 현재 작업경로를 절대 경로로 반환한다.
2. os.getcwdb() : 현재 작업경로를 절대 경로로 바이트 반환한다.
3. os.chdir(path) : 현재 작업경로를 path로 설정한다.(상대 경로도 인정한다)
4. os.listdir(path) : path 디렉토리에 있는 항목들의 이름을 담고 있는 LIST를 반환한다. path가 생략되면 현재 디렉터리를 탐색
5. os.scandir(path) : path 디렉토리에 있는 항목들의 이름을 담고 있는 순서 없는 Iterator를 반환한다. path가 생략되면 현재 디렉터리이며, 현재 경로인 ".", 상위 경로인 ".."은 포함하지 않고, scandir.close()로 종료된다.
5. os.lstat(filename) : 주어진 경로에 대해 lstat 명령어를 실행한다(파일의 속성을 가져오는 명령어 이다)
6. os.readlink(path) : path인 심볼릭 링크가 가리키는 경로를 문자열로 반환한다.

* scandir로 생성된 Iterator는 DirEntry라는 객체로 반환되는데, name, path, inode 등 파일 속성에 대한 정보를 가지고 있다.

 


파일, 디렉터리 조작

1. os.mkdir(path) : path라는 디렉터리를 생성한다.
2. os.makedirs(name) : 재귀적으로 name의 디렉터리를 생성한다.(ex : 상위 폴더가 없으면 그것도 만들고, 위에 것도 만든다.)
3. os.remove(path) : 파일 path를 제거한다. path가 디렉터리인 경우 Exception이 발생된다.
4. os.rmdir(path) : 디렉터리 path를 제거한다. 디렉터리가 존재하지 않거나 비어있지 않으면 Exception이 발생된다.
5. os.removedirs(name) : 재귀적으로 name의 디렉터리를 제거한다.(ex : 상위 폴더도 없애고, 그 위 것도 없애고)
6. os.rename(src, dst) : src를 dst로 이름을 바꾼다 이미 dst가 존재하는 경우 Exception이 발생된다.
7. os.renames(old, new) : old를 new로 재귀적으로 이름을 바꾼다.(만약 new에 없는 디렉터리 경로가 있으면 생성한다.)
8. os.symlink(src, dst) : dst를 가리키는 소프트 링크 src를 생성한다
9. os.truncate(path, length) : 강제로 path파일을 length 크기에 맞춘다.(이거 무슨 침대 있지 않았나?) 자르는 것이다.

 


프로세스 조작

1. os.abort() : 현재 실행 중인 프로세스에 SIGABRT 시그널을 보낸다.
2. os.add_dll_directory(path) : DLL탐색경로에 path를 추가한다.(안 써봐서 이건 모르겠다.)
3. os.execl(path, args...) : 현재 프로세스를 대체해서 새로운 프로세스를 생성한다. 이는 Python에 결과를 반환하지 않는다. (ex : os.execl("notepad.exe")는 현재 Python이 종료되고, 메모장이 실행된다.
4. os._exit(n) : 종료 코드 n으로 프로세스를 종료시킨다.
5. os.kill(pid, sig) : 프로세스 pid에 시그널 sig를 전송한다. 그룹 단위로 전송하는 killpg도 있다.
6. os.popen(cmd) : 이거 할 말 많은 함수인데, 명령 프롬포트와 파이프라인을 연결한다. Python에서 다른 명령줄(cmd)을 실행할 때 사용된다. subprocess모듈과 깊은 관련이 있고, 관련 내용은 모듈 탐구가 아닌, 다른 포스팅으로 자세하게 소개하겠다.
7. os.startfile(path) : 파일 탐색기에서 path를 두 번 클릭하는 것과 같은 결과이다. 따라서 os.startfile()은 시작하자마자 끝난다.
8. os.system(command) : 프로그램이 별도의 명령 프롬포트(cmd)(사실 여기선 SHELL이 맞는 말이다.)을 실행하여 command를 실행한다. 이 또한 위 popen처럼 별도의 포스팅에서 서술한다.
9. os.times() : 모든 프로세스 시간을 반환한다.
10. os.waitpid(pid, 0) : 지정된 pid의 프로세스가 종료될 때까지 기다린다.

 

 


* 출처 : https://docs.python.org/ko/3/library/os.html

 

os — 기타 운영 체제 인터페이스 — Python 3.9.4 문서

os — 기타 운영 체제 인터페이스 소스 코드: Lib/os.py 이 모듈은 운영 체제 종속 기능을 사용하는 이식성 있는 방법을 제공합니다. 파일을 읽거나 쓰고 싶으면 open()을 보세요, 경로를 조작하려면 o

docs.python.org



한 번씩 써 본 함수만 적은 건데 엄청나게 많은 함수가 있고 포스팅에 적힌 os모듈은 반의반도 기술되지 않은 것이기에 놀라울 따름이다. 공식 홈페이지 문서는 꼭 찾아볼 것!

컴퓨터 세계에서 자주 사용되는 json이라는 표준이다. json은 Python을 자주 사용하는 사람이라면 아는 dictionary이라는 자료구조와 유사하게 생겼는데, 광범위하게 데이터 오브젝트를 인간이 읽을 수 있는 상태에서 전달하기 위한 표준이다. 다음은 json의 예시이다.

{
    "file_format_version" : "1.0.0",
    "ICD": {
        "library_path": ".\\XXX.dll",
        "api_version": "1.0.3"
    }
}

// json파일의 예시



json처럼 객체를 저장하고 나중에 재구성할 수 있는 포맷으로 표기하는것을 직렬화(Seriallization), 그 데이터를 다시 불러오는 것을 역직렬화(Deseriallization)이라고 한다. Python은 json처럼 인간 읽을 수 있는 방식 말고 pickle이라는 모듈을 이용해서 바이트 수준의 직렬화를 제공한다.



pickle을 이용한 데이터의 저장


다음은 students LIST객체를 my_list.dump에 저장하는 예시이다. byte연산을 수행하는 만큼 파일모드를 wb로 열었다.

>>> import pickle
>>> students = ["CHEEL","GLAADOS","STEENLY"]
>>> with open("my_list.dump","wb") as f:
	pickle.dump(students,f)

>>> b_students = pickle.dumps(students)
>>> print(b_students)
b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00]\x94(\x8c\x05CHEEL\x94\x8c\x07GLAADOS\x94\x8c\x07STEENLY\x94e.'


* b_students처럼 저장하는 대신 pickle.dumps(students)로 바이트 반환받을 수 있다.

 



pickle을 이용한 데이터의 불러오기


다음은 my_list.dump에 저장된 바이트스트림을 students에 다시 할당하는 코드이다. 역시 rb로 열었다.

>>> import pickle
>>> with open("my_list.dump","rb") as f:
	new_students = pickle.load(f)

>>> print(new_students)
['CHEEL', 'GLAADOS', 'STEENLY']
>>> new_b_students = pickle.loads(b_students)
>>> print(new_b_students)
['CHEEL', 'GLAADOS', 'STEENLY']


* 역시 pickle.loads(datas)로 파일연산없이 직접 받을 수 있다.



* pickle불가한 객체를 pickle 하면 PicklingError라는 Exception이 발생한다. 가능한 객체 목록은 API를 참조하자
* 클래스 인스턴스를 pickle하는 방법이 API에 나와있다. __init__()이 호출되는 것이 아닌, 기존의 attribute를 저장했다가 load 하는 방식인데, 사용자가 재정의할 수 있다는 점에서 재미있는 이야기이니, API를 한 번씩 읽어보기를 바란다.
* 과거에는 pickle과 비슷한 marshal이라는 모듈이 있었다고한다.(안써봤다.) API에서는 여러 가지 이유로 marshal대신 pickle을 쓰기를 권장한다.

 

* 출처 : docs.python.org/ko/3/library/pickle.html

 

pickle — 파이썬 객체 직렬화 — Python 3.9.4 문서

pickle — 파이썬 객체 직렬화 소스 코드: Lib/pickle.py pickle 모듈은 파이썬 객체 구조의 직렬화와 역 직렬화를 위한 바이너리 프로토콜을 구현합니다. 《피클링(pickling)》은 파이썬 객체 계층 구조가

docs.python.org



이번시간에는 Python의 직렬화 / 역직렬화 방식인 pickle에 대해서 알아보았다. 거대한 데이터를 저장하거나, 변수의 프로그램 수명에서 재사용할 시 채용할 수 있는 기법이니, 익혀두면 도움이 될 것이다.

혹시 이 글을 읽는 독자는 LIST의 복사를 시도해보았는가? 아마 a=[1,2,3]과 같은 LIST를 바로 b=a로 복사부터 시도했을 가능성이 크다(우리 Python은 직관적이어서 이거도 돼야 되는 거 아닌가?) 웃긴 건 이때 a [0]=5를 하면 b도 [5,2,3]이 된다는 점이다. 이는 복사의 깊이가 달라서 생기는 문제이다.

 


복사의 구분

복사는 수준에 따라 다음과 같이 구분된다.

① 얕은 복사(Shallow copy) : 메모리 주소만 같은 곳을 가리키게 복사되는것, 값이 복사되는 것은 아니다.
② 깊은 복사(Deep copy) : 실제 값까지 모두 복사되는 것

 

Python은 모듈 copy를 통해서 이 복사행위를 다룬다. 다음은 두 가지는 copy모듈이 제공하는 함수이다.

1. copy.copy(x) : x의 얕은 복사결과를 반환

2. copy.deepcopy(x) : x의 깊은 복사결과를 반환

 

다음은 예시이다.

>>> import copy
>>> a=[[1,2,3,4,5],[6,7,8,9]]
>>> b = copy.copy(a)
>>> a[1].append(10)
>>> print(b)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
>>> b = copy.deepcopy(a)
>>> a[1].append(11)
>>> print(b)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

다음과 같이 얕은복사로 이루어진 copy.copy는 원본의 추가 연산이 복사본에도 영향이 가고, 깊은 복사가 실행된 이후에는 원본의 변화가 복사본에 영향을 미치지 않는 것을 확인할 수 있다.


이번 모듈탐구 시간에는 복사를 용이하게 도와주는 copy모듈에 대해서 알아보았다. 비록 list를 예시로 들었지만, 다른 자료구조(Dict, tuple 등)이나 객체에도 해당되는 이야기이니, 유용하게 사용하기를 바란다.

base64라는 인코딩 방식을 들어본 적이 있는가? 컴퓨터 분야에서 상당히 많이 쓰이는 인코딩 방식이넫, 이진 파일들을 문자 코드에 영향을 받지 않는 64개의 ASCII를 사용하여 일련의 문자열로 변환하는 인코딩 방식이다. 이와 비슷하게 base32, base 16 방식도 존재하고, ASCII 문자 자체가 128개가 되지 않기 때문에 base128은 없는 방식이다.(대신 귀 여운 8 5를준 비했습니다.) 특수한 규약으로는 base64로 인코딩 된 문자는 = 혹은 ==으로 끝이난 다는 점이다. 모듈 탐구 시간, 오늘은 이 base인코딩을 다루는 base64 모듈을 알아보도록 하자


base64모듈에서 사용되는 함수들은 전부 base64 클래스의 클래스 함수이다.

 

부호기 - ENCODER

1. base64.b64encode(s) : 바이트 객체 s를 받아 인코딩 된 byte를 반환한다.

2. base64.standard_b64encode(s) : 바이트 객체 s를 받아 표준 base64알파벡으로 인코딩 된 byte를 반환한다.

3. base64.urlsafe_b64encode(s) : 바이트 객체 s를 받아 url에서 사용 가능한 base64인 코딩된 byte를 반환한다.

4. base64.b32encode(s) : 바이트 객체 s를 받아 base32로 인코딩 된 byte를 반환한다.

5. base64.b16encode(s) : 바이트 객체 s를 받아 base 16으로 인코딩 된 byte를 반환한다.

6. base64.a85encode(s) : 바이트 객체 s를 받아 Ascii85를 사용해 인코딩 된 byte를 반환한다.

7. base64.b85encode(s) : 바이트 객체 s를 받아 base85를 사용해 인코딩 된 byte를 반환한다.

8. base64.encode(input,output) : input, output은 file객체여야 한다. input의 내용을 base64로 인코딩하여 output에 쓴다.

9. base64.encodebytes(s) : 바이트객체 s를 받아 base64로 인코딩하고, 76바이트마다 개행(b"\n")을 포함하여 결과를 반환한다.

 

복호기 - DECODER

1. base64.b64decode(s) : 바이트 객체 s를 받아 인코딩 된 byte를 반환한다.

2. base64.standard_b64decode(s) : 바이트 객체 s를 받아 표준 base64알파벡으로 인코딩 된 byte를 반환한다.

3. base64.urlsafe_b64decode(s) : 바이트 객체 s를 받아 url에서 사용 가능한 base64인 코딩된 byte를 반환한다.

4. base64.b32decode(s) : 바이트 객체 s를 받아 base32로 인코딩 된 byte를 반환한다.

5. base64.b16decode(s) : 바이트 객체 s를 받아 base 16으로 인코딩 된 byte를 반환한다.

6. base64.a85decode(s) : 바이트 객체 s를 받아 Ascii85를 사용해 인코딩 된 byte를 반환한다.

7. base64.b85decode(s) : 바이트 객체 s를 받아 base85를 사용해 인코딩 된 byte를 반환한다.

8. base64.decode(input,output) : input, output은 file객체여야 한다. input의 내용을 base64로 인코딩하여 output에 쓴다.

9. base64.decodebytes(s) : 바이트객체 s를 받아 base64로 인코딩하고, 76바이트마다 개행(b"\n")을 포함하여 결과를 반환한다.

 

코드 예시

base64.encode, base64.decode를 제외한 모든 코드의 사용이 동일하여 일반 문자열 strs가 base64로 encode > decode 되는 순서의 예시를 첨부한다.

>>> import base64
>>> strs = "나의 문자열 썸띵입니다,"
>>> strs = strs.encode()
>>> strs
b'\xeb\x82\x98\xec\x9d\x98 \xeb\xac\xb8\xec\x9e\x90\xec\x97\xb4 \xec\x8d\xb8\xeb\x9d\xb5\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4,'
>>> en = base64.b64encode(strs)
>>> print(en)
b'64KY7J2YIOusuOyekOyXtCDsjbjrnbXsnoXri4jri6Qs'
>>> de = base64.b64decode(en)
>>> print(de)
b'\xeb\x82\x98\xec\x9d\x98 \xeb\xac\xb8\xec\x9e\x90\xec\x97\xb4 \xec\x8d\xb8\xeb\x9d\xb5\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4,'

* 출처 : docs.python.org/ko/3/library/base64.html

 

base64 — Base16, Base32, Base64, Base85 데이터 인코딩 — Python 3.9.4 문서

base64 — Base16, Base32, Base64, Base85 데이터 인코딩 소스 코드: Lib/base64.py 이 모듈은 바이너리 데이터를 인쇄 가능한 ASCII 문자로 인코딩하고 이러한 인코딩을 다시 바이너리 데이터로 디코딩하는 함

docs.python.org


컴퓨터세상에 발을 들였으면, 인코딩 타입은 어느 분야에서든(DB, NETWORK, 웹 등등 진짜 어디서든) 사용된다. 그중 표준 인코딩 타입처럼 많이 사용되는 것이 base64이다. 이 모듈을 자유자재로 다룰 줄 알게 되면, 다른 분야에서 python을 사용하는 데에 많은 도움이 될 것이라고 확신한다.

2번째 모듈 탐구 이번 살펴볼 모듈은 random이다. 사실 random을 컴퓨터에서 완전히 구현하는 것은 불가하다고 본다. 일정수의 주기를 가지고 생성하는 유사 난수 생성기(PRING)로 난수를 생성하게 되는데, 이 난수를 더욱 잘 처리할 수 있게 도와주는 모듈이 random 모듈이다.


일단 random모듈에서 제공하는 함수는 Random 클래스에 정의된 클래스 메서드 이다.(random 모듈에서 제공하는 클래스는 random과 systemrandom 2가지이다.) 그중 대부분의 함수는 다음의 random.random()이라는 [0, 1.0) 사이 무작위 float를 반환하는 기본 함수에 의존한다.

 

난수 생성기를 관리하는 함수

random.seed(a=None) : 난수 생성기는 무엇을 기준으로 난수를 생성할지 기준(Seed값)을 가지게 된다. seed함수는 이 기준값을 초기화 하주며, None으로 정의될 경우 현재의 시스템 시간이 seed로 사용된다.

 

* 난수생성기의난수 생성기의 현재 상태는 getstate()로 구할 수 있고, setstate()로 설정할 수도 있다.(이를 이용하여 난수 생성기의 당시 상태를 저장, 불러올 수 있다.)

 

난수 생성기의 생성 함수

1. random.randbytes(n) : n자리의 무작의 byte를 생성한다/

2. random.randrange(start, stop, step) : range(start, stop, step)중 임의로 선택된 요소를 반환한다. 만약 파라미터가 1개가 주어지면 range(parameter)에서 무작위로 선택한다.

3. random.randint(a, b) : a <=N <=b에 부합하는 임의의 N을 반환한다.

4. random.getrandbits(k) : k bit로 이루어진 양의 정수를 반환한다.

5. random.random() : [0.0, 1.0)의 구간에서 임의의 부동 소수점 숫자를 반환한다.

6. random.uniform(a, b) : a <=N <=b에 부합하는 임의의 부동소수점 N을 반환한다.(b> a인 경우 반대로)

>>> import random
>>> random.randbytes(3)
b'\x81\xebA'
>>> random.randrange(0,10)
2
>>> random.randint(0,10)
7
>>> random.getrandbits(3)
7
>>> random.random()
0.3533718176197945
>>> random.uniform(3,5)
3.3321894552898152

 

난수 생성기의 시퀀스 처리 함수

1. random.choice(seq) : 비어있지 않은 seq에서 임의의 요소를 반환한다.

2. random.choices(population, k=n) : population에서 중복을 허락하며 길이가 k인 list를 반환한다.

3.. random.sample(population, k) : population에서 중복을 허락하지 않고 길이가 k인 list를 반환한다. 

4. random.shuffle(seq) : seq를 섞습니다.

>>> import random
>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> random.choice(a)
7
>>> random.choices(a,k=5)
[2, 10, 5, 7, 5]
>>> random.sample(a,5)
[9, 6, 5, 8, 3]
>>> random.shuffle(a)
>>> a
[7, 8, 4, 1, 3, 2, 9, 5, 6, 10]

 

* Python은 메르센 트위스터(Mersenne Twister)라는 난수 생성기를 사용한다. 이는 53비트의 정밀도와 2**19937-1의 주기를 가지는데(총각 그게 좋은 거유~?) 혹시나 자신만의 난수 생성기를 사용할 사람은 random클래스를 상속받아서 쓰라고 API에 쓰여있다.

* random모듈의 실수 반환 랜덤은 수학적인 radom함수를 다수 가지고 있다. 필자는 수학을 못해서 넘어갔지만, 공학도 분들께서는 gauss, expovariate, gammavariate, weibullvariate(아니 영어도 무슨 뜻인지 모르겠다.)등을 보고 사용하도록 하자

 

* 출처 : docs.python.org/ko/3/library/random.html

 

random — 의사 난수 생성 — Python 3.9.4 문서

random — 의사 난수 생성 소스 코드: Lib/random.py 이 모듈은 다양한 분포에 대한 의사 난수 생성기를 구현합니다. 정수에 대해서는, 범위에서 균일한 선택이 있습니다. 시퀀스에 대해서는, 무작위

docs.python.org


'm번모시았알을 d. 간 o 다이는 nr보 a아듈'

다음 시간은 다른 모듈 탐구 포스팅으로 여러분들을 찾아뵙겠다.

모듈 탐구 그 첫 번째 시간 time 함수이다. 사실 필자는 time 모듈을 사용하면서 sleep함수나 strptime 등 쓰던 함수만 쓰는 일이 다수 있지만.... 이번 기회에 time 모듈을 조금 공부하면서 아는 지식을 정리하고자 한다.


일단 용어를 정리하고 가야한다.

* 에포크(epoch) : 시간이 시작되는 시점(태초에 만물이 있을 지어니...) 플랫폼에 따라 다른데 예를 들면 유닉스는 1970년 1월 1일 00:00:00(UTC)이다. time.gmtime(0)로 알아볼 수 있다.

* UTC : 협정 세계시로, 그리니치 표준시인 GMT로 알려져 있다.

* DST : 일광 절약 시간으로 일 년 중 일부 기간 시간대를 한 시간 조정하는(서머타임)이다. 

 

먼저 에포크 이후의 시간은 time.time()으로 구할 수 있다. time.time()은 에포크 이후의 초를 나타내는 시간을 부동 소수점 숫자로 표현(뒤에 ns를 붙여서 정수로 나노초 반환 가능)한다.

>>> import time
>>> time.time()
1618071662.5779314
>>> time.time_ns()
1618071676597228800

 

클래스 : struct_time

time 모듈에 정의되며 자주 사용되는 객체는 struct_time이라는 객체이다.

이 struct_time은 다음과 같은 어트리뷰트를 가진다.

1. tm_year : 예를 들면 1998, 연도를 가리킨다.

2. tm_mon : 1-12의 달을 가리킨다.

3. tm_mday : 1-31의 달에 있을 수 있는 일자를 가리킨다.

4. tm_hour : 0-23의 시간을 가리킨다.

5. tm_min : 0-59의 분을 가리킨다.

6. tm_sec : 0-61의 초를 가리킨다.(?? 왜 61초이지?)

7. tm_yday : 1-366의 연에 있을 수 있는 일을 가리킨다.(아마 윤달 계산한 듯)

8. tm_isdst : 0,1,-1의 값을 가진다. 일광 절약 시간제가 발효 중인 경우 1 아니면 0, 모르면 -1

9. tm_zone : 시간대 이름의 약어, 필수는 아니다.

10. tm_gmtoff : UTC에서 동쪽으로 초 단위 오프셋, 필수는 아니다.

 

struct_time을 반환하는 함수

1. time.gmtime() : 에포크 이후의 초단위 시간을 tm_isdst가 0인 UTC로 반환한다.

2. time.localtime() : gmtime()과 같으나, 현지시각으로 변환한다.

3. time.strptime(Stirng) : 문자열로 시간을 맡아서 이걸 struct_time으로 반환한다.

>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=10, tm_hour=16, tm_min=22, tm_sec=27, tm_wday=5, tm_yday=100, tm_isdst=0)
>>> time.localtime()
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=11, tm_hour=1, tm_min=22, tm_sec=31, tm_wday=6, tm_yday=101, tm_isdst=0)
>>> time.strptime("11 Apr 2021","%d %b %Y")
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=101, tm_isdst=-1)

 

struct_time → 부동소수점 실수

1. time.mktime(t) : struct_time자료형의 t를 받아들여 초를 부동소수점으로 반환한다.

>>> import time
>>> cur=time.localtime()
>>> time.mktime(cur)
1618071881.0

 

혹은 이 struct_time을 이쁜 말로 변경할 수도 있다.

1. time.asctime(t) : struct_time자료형의 t를 받아들여 ex : 'Sat Apr 10 15:42:41 2021'로 표현한다.

* 유사 함수로 time.ctime()이 있는데, 에포크 이후 초로 표현된 시간을 현지 시간으로 보인다.

2. time.strftime(format, t) : struct_time자료형을 받아들여 아래와 같은 규약으로 문자열을 생성한다.

지시자 의미
%a, %A 약식 요일, 전체 요일
%b, %B 약식 월, 전체 월
%c 적절한 날짜와 시간
%d 월중 일을 십진수(01~31)로 표현
%H, %I 각각 24, 12시간을 십진수로
%J 연중 일(001~366)을 십진수로
%m, %M 월, 분을 십진수로
%P AM, PM에 해당하는 시간값
%S 초를 십진수로
%U 연중 주번호를 십진수로(0~53)
%w 요일을 십진수로(0[일요일] ~ 6)

 

time모듈을 이용한 프로세스 실행시간의 측정

1. time.process_time() : 프로세스의 실행시간을 부동소수점 실수로 반환한다.(time.sleep으로 스킵된 시간 제외)

2. time.monotonic() : 단조 증가 시간을 부동소수점 실수로 반환한다.

3. time.perf_counter() : 프로세스의 실행시간을 부동소수점 실수로 반환한다.(time.sleep으로 스킵된 시간 포함)

* 위 함수들은 환경마다 달라지기에, 2번 호출하여 비교하는 것이 올바르다.

* 위 함수들은 뒤에 _ns를 붙여 정수의 나노초를 반환할 수 있다, ex : time.process_time_ns()

 

프로그램의 정지

Python 멈춰! 를 구현할 수 있는 time.sleep() 함수이다. time.sleep()은 아래 코드와 같이 사용되며, 호출하는 스레드를 일시 중단하는 기능을 가지고 있다.

import time
print("Python 멈춰!")
time.sleep(3)
print("3초후, 넌 이미 출력되어있다.")

위 코드의 2번째 print는 3초 후에 출력된다.

 

 

 

* time모듈에는 이 외에도 스레드의 시간을 스레드 별로 측정하게 도와주는 clock_XX함수가 있다. 궁금한 사람들은 다음의 API를 읽어보기를 바란다.

* 출처 : docs.python.org/ko/3/library/time.html

 

time — 시간 액세스와 변환 — Python 3.9.4 문서

time — 시간 액세스와 변환 이 모듈은 다양한 시간 관련 함수를 제공합니다. 관련 기능에 대해서는, datetime과 calendar 모듈도 참조하십시오. 이 모듈을 항상 사용할 수 있지만, 모든 플랫폼에서 모

docs.python.org

 


python에서 프로그램 실행시간을 측정하고, 시간에 관련된 함수와 구조체를 제공하며, 프로그램의 정지까지 제공하는 time모듈에 대해서 알아보았다. "에에? 시간에 관련해서는 datetime이 더 세련된 모듈 아닌가요><??" 모르는 소리, datetime 또한 import time as _time으로 구현되며 시작한다. 이로써 프로그램에서 우리의 시간을 다루는 능력이 더욱 향상되었기를 바란다. 

+ Recent posts