__name__이란 모듈(module)의 이름(파일 이름)을 저장하는 파이썬의 내장 변수 입니다. __main__ 은 최상위 모듈, 즉 현재 실행되는 스크립트를 나타내는 이름입니다. 파일의 이름과 상관없이 제일 처음 실행되는 파일의 모듈 이름은 __main__입니다. 따라서 위의 코드는 모들의 이름이 __main__이면, 즉 if문의 조건이 참(True)이면 if문에 코딩한 내용을 실행하게 됩니다. 즉 현재 스크립트로 실행되는지, 아니면 다름 스크립트의 모듈로 임포트되어 사용되는지를 판단하는 데 사용됩니다.
예제를 통해 자세히 알아 보겠습니다.
# woo.py
def add(a, b):
print('이 함수는 woo모듈의 add함수 입니다.')
return a + b
# __name__ 변수 출력
print('모듈 이름:', __name__)
# 이 모듈이 최상위 모듈이면 add( )함수를 실행
if __name__ == '__main__':
print(add(1, 2))
'''
( 실행 결과 )
$ python woo.py
모듈 이름: __main__
이 함수는 woo모듈의 add함수 입니다.
3
'''
현재 woo.py 모듈만 있고, 따라서 이 모듈이 main이기 때문에 if문 안에 있는 foo( )함수가 실행됩니다.
이제 다른 모듈에서 woo모듈을 호출해서 사용해 보겠습니다.
# boo.py
import woo # woo모듈을 가져 옵니다.
# __name__ 변수 출력
print('모듈 이름:', __name__)
def sub(a, b):
print('이 함수는 boo모듈의 sub함수 입니다.')
return a - b
if __name__ == "__main__": # 이 파일이 시작점일 때만 아래 코드를 실행
print(woo.add(5, 2))
print(sub(5, 2))
'''
( 실행 결과 )
$ python boo.py
모듈 이름: woo
모듈 이름: __main__
이 함수는 woo모듈의 add함수 입니다.
7
이 함수는 boo모듈의 sub함수 입니다.
3
'''
woo.py는 boo.py에 import해서 사용하기 때문에 더이상 __main__이 아닙니다.
따라서 모듈이름 woo가 출력됩니다.
반면 지금 실행한 boo.py는 최상위 모듈이기 때문에 모듈 이름은 __main__으로 출력됩니다.
그리고 if문의 조건이 만족하기 때문에 woo.add( )와 sub( )함수 모두 실행 됩니다.
whence : 포인터( 커서 )이동의 기준점입니다. - 기본값은 0이며 생략할 수 있습니다. - 0(기본값)은 파일의 처음을 의미 합니다. - 1은 현재 파일의 포인터(커서) 위치를 의미 합니다. - 2는 파일의 끝을 의미합니다.
* [ ] 대괄호 안의 whence는 생략할 수 있습니다.
우선 파일을 읽어 객체를 생성합니다.
# test.txt파일을 읽기 모드로 읽어서 foo에 보관합니다.
# test.txt의 내용은 '0123456789 abcdefghi'라고 가정합니다.(20바이트)
foo = open( 'test.txt' , mode='r', encoding='utf-8' )
# 만일 파일의 맨 뒤에서 읽어오려면 파일을 바이너리 모드로 읽어와야 합니다.
# 이때 인코딩은 하지 않습니다.
foo = open( 'test.txt' , mode='rb' )
import re
# 텍스트 모드로 읽을 때
# foo = open( 'test.txt', mode='r', encoding='utf-8' )
# 바이너리 모드로 읽을 때
foo = open( 'test.txt', mode='rb')
bar = foo.read()
print(bar)
# 출력 텍스트 모드: 0123456789 abcdefghi
# 출력 바이너리 모드: b'0123456789 abcdefghi'
# whence는 생략 되었기 때문에 커서는 처음부터 3글자를 이동한 후에 2글자를 읽어 들입니다.
foo.seek(3)
foobar = foo.read(2)
print(foobar)
# 출력 텍스트 모드: 34
# 출력 바이너리 모드: b'34'
# 여기서 다시 읽으면 현재 커서의 위치가 5글자 다음에 위치 하기 때문에 그 다음 부터 읽어 들이게 됩니다.
foobar = foo.read(3)
print(foobar)
# 출력 텍스트 모드: 567
# 출력 바이너리 모드: b'567'
# 커서를 파일 맨뒤에서 5글자 앞(왼쪽)으로 간 후에 2글자를 읽어 옵니다.
# 여기서 주의할 점은 뒤에서 부터 읽어 들이려면, 파일을 가져 올때 바이너리 모드로 가져와야 합니다. mode='rb'
foo.seek(-5, 2)
foobar = foo.read(2)
print(foobar)
# 출력 텍스트 모드: ef
# 출력 바이너리 모드: b'ef'