linecache — 텍스트 줄에 임의 접근

linecache — 텍스트 줄에 임의 접근

linecache 모듈은 Python 소스 파일의 어떤 줄이든 가져올 수 있게 해 주는데, 한 파일에서 많은 줄을 읽는 흔한 경우를 내부적으로 캐시로 최적화해요. traceback 모듈이 형식화된 traceback에 포함할 소스 줄을 가져올 때 이걸 사용해요.

파일을 열 때는 tokenize.open() 함수를 사용해요. 이 함수는 tokenize.detect_encoding()으로 파일 인코딩을 알아내고, 인코딩 토큰이 없으면 기본적으로 UTF-8을 사용해요.

출처: Python 표준 라이브러리

본문

linecache 모듈은 다음 함수들을 정의해요.

linecache.getline(filename, lineno, module_globals=None)

filename이라는 파일에서 lineno 줄을 가져와요. 이 함수는 절대 예외를 일으키지 않아요. 오류가 나면 ''를 돌려주죠(찾은 줄에는 종료 줄바꿈 문자가 포함돼요).

filename이 프리즈된 모듈('<frozen '으로 시작)을 가리키면, module_globalsNone이 아닐 때 module_globals['__file__']에서 실제 파일 이름을 가져오려 시도해요.

filename이라는 이름의 파일을 찾지 못하면, 이 함수는 먼저 module_globals의 PEP 302 __loader__를 확인해요. 그런 로더가 있고 get_source 메서드를 정의한다면 그게 소스 줄을 결정해요(get_source()None을 돌려주면 ''가 반환돼요). 마지막으로 filename이 상대 경로라면 모듈 검색 경로 sys.path의 항목을 기준으로 찾아봐요.

버전 3.14에서 변경: 프리즈된 모듈의 filename 지원.

linecache.clearcache()

캐시를 지워요. 이전에 getline()으로 읽은 파일의 줄이 더 이상 필요 없을 때 이 함수를 사용해요.

linecache.checkcache(filename=None)

캐시의 유효성을 확인해요. 캐시 안의 파일이 디스크에서 변경됐고 갱신된 버전이 필요할 때 이 함수를 사용해요. filename을 생략하면 캐시의 모든 항목을 확인해요.

linecache.lazycache(filename, module_globals)

파일 기반이 아닌 모듈에 대해, 나중에 getline()으로 줄을 얻을 수 있게 충분한 세부 정보를 포착해요. 이때 나중 호출에서 module_globalsNone이어도 괜찮아요. 이렇게 하면 모듈 globals를 계속 들고 다닐 필요 없이, 실제로 줄이 필요할 때까지 I/O를 미루는 걸 피할 수 있어요.

버전 3.5에 추가됨.

예:

>>> import linecache
>>> linecache.getline(linecache.__file__, 8)
'import sys\n'