fileinput — 여러 입력 스트림에서 줄 단위 반복

fileinput — 여러 입력 스트림에서 줄 단위 반복

이 모듈은 표준 입력 또는 파일 목록에 대한 루프를 빠르게 작성하는 데 쓰는 헬퍼 클래스와 함수를 구현해요. 그냥 파일 하나를 읽거나 쓰고 싶다면 open()을 보세요.

출처: Python 표준 라이브러리

본문

전형적인 사용은 이렇게 돼요.

import fileinput
for line in fileinput.input(encoding="utf-8"):
    process(line)

이것은 sys.argv[1:]에 나열된 모든 파일의 줄을 반복하고, 그 목록이 비어 있으면 sys.stdin을 기본으로 사용해요. 파일명이 '-'이면 그것도 sys.stdin으로 대체되고 선택 인자 modeopenhook은 무시돼요. 대체 파일명 목록을 지정하려면 input()의 첫 번째 인자로 전달하면 돼요. 단일 파일 이름도 허용돼요.

모든 파일은 기본적으로 텍스트 모드로 열리지만, input() 또는 FileInput 호출에서 mode 매개변수를 지정해 덮어쓸 수 있어요. 파일을 여는 중이거나 읽는 중에 I/O 오류가 발생하면 OSError가 발생해요.

버전 3.3에서 변경: 이전에 IOError가 발생했는데, 이제 OSError의 별칭임.

sys.stdin이 두 번 이상 사용되면 두 번째부터는 줄을 반환하지 않아요. 대화형 사용이나 명시적으로 리셋한 경우(sys.stdin.seek(0) 등)는 예외일 수 있어요.

빈 파일은 열렸다가 즉시 닫혀요. 파일명 목록에서 그 존재가 눈에 띄는 유일한 때는 가장 마지막에 연 파일이 빈 파일일 때뿐이에요.

줄은 새 줄을 그대로 유지한 채 반환돼요. 그러니까 파일의 마지막 줄은 새 줄이 없을 수도 있어요.

fileinput.input() 또는 FileInput()openhook 매개변수로 열기 훅을 제공해 파일이 어떻게 열리는지 제어할 수 있어요. 훅은 filenamemode 두 인자를 받아 그에 맞게 열린 파일류 객체를 돌려주는 함수여야 해요. encoding 및/또는 errors를 지정하면 추가 키워드 인자로 훅에 전달돼요. 이 모듈은 압축 파일을 지원하는 hook_compressed()를 제공해요.

이 모듈의 주요 인터페이스는 다음 함수예요.

fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)

FileInput 클래스의 인스턴스를 만들어요. 그 인스턴스는 이 모듈 함수들의 전역 상태로 사용되고, 반복 중에 사용하도록 반환되기도 해요. 이 함수의 매개변수는 FileInput 클래스의 생성자로 전달돼요.

FileInput 인스턴스는 with 문에서 컨텍스트 매니저로 사용할 수 있어요. 이 예시에서는 예외가 발생해도 with 문을 빠져나온 뒤 input이 닫혀요.

with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f:
    for line in f:
        process(line)

버전 3.2에서 변경: 컨텍스트 매니저로 사용할 수 있음. 버전 3.8에서 변경: 키워드 매개변수 modeopenhook이 이제 키워드 전용임. 버전 3.10에서 변경: 키워드 전용 매개변수 encodingerrors가 추가됨.

다음 함수들은 fileinput.input()이 만든 전역 상태를 사용해요. 활성 상태가 없으면 RuntimeError가 발생해요.

  • fileinput.filename() — 현재 읽고 있는 파일의 이름을 돌려줘요. 첫 줄을 읽기 전에는 None을 돌려줘요.
  • fileinput.fileno() — 현재 파일의 정수 "파일 디스크립터"를 돌려줘요. 열린 파일이 없으면(첫 줄 전과 파일 사이) -1을 돌려줘요.
  • fileinput.lineno() — 방금 읽은 줄의 누적 줄 번호를 돌려줘요. 첫 줄을 읽기 전에는 0을 돌려줘요. 마지막 파일의 마지막 줄을 읽은 후에는 그 줄의 번호를 돌려줘요.
  • fileinput.filelineno() — 현재 파일에서의 줄 번호를 돌려줘요. 첫 줄 전에는 0, 마지막 파일의 마지막 줄 후에는 그 줄의 파일 내 번호를 돌려줘요.
  • fileinput.isfirstline() — 방금 읽은 줄이 그 파일의 첫 번째 줄이면 True, 아니면 False를 돌려줘요.
  • fileinput.isstdin() — 마지막 줄이 sys.stdin에서 읽혔으면 True, 아니면 False를 돌려줘요.
  • fileinput.nextfile() — 현재 파일을 닫아서 다음 반복이 다음 파일(있으면)의 첫 줄을 읽도록 해요. 파일에서 읽지 않은 줄은 누적 줄 수에 세지 않아요. 파일명은 다음 파일의 첫 줄을 읽은 후에야 바뀌어요. 첫 줄을 읽기 전에는 이 함수가 효과가 없고, 첫 파일을 건너뛰는 데는 쓸 수 없어요. 마지막 파일의 마지막 줄을 읽은 후에는 효과가 없어요.
  • fileinput.close() — 시퀀스를 닫아요.

모듈이 제공하는 시퀀스 동작을 구현하는 클래스도 서브클래싱할 수 있어요.

class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)

FileInput 클래스가 구현이고, 메서드 filename(), fileno(), lineno(), filelineno(), isfirstline(), isstdin(), nextfile(), close()는 모듈의 같은 이름 함수에 대응해요. 게다가 이터러블이고 다음 입력 줄을 돌려주는 readline() 메서드도 있어요. 시퀀스는 엄격히 순차적으로 접근해야 해요. 무작위 접근과 readline()은 섞을 수 없어요.

modeopen()에 전달할 파일 모드를 지정할 수 있어요. 'r''rb' 중 하나여야 해요.

openhook이 주어지면 filenamemode 두 인자를 받아 그에 맞게 열린 파일류 객체를 돌려주는 함수여야 해요. inplaceopenhook은 함께 쓸 수 없어요.

open()이나 openhook에 전달되는 encodingerrors를 지정할 수 있어요.

FileInput 인스턴스는 with 문에서 컨텍스트 매니저로 사용할 수 있어요.

with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)

버전 3.2에서 변경: 컨텍스트 매니저로 사용할 수 있음. 버전 3.8에서 변경: 키워드 매개변수 modeopenhook이 이제 키워드 전용임. 버전 3.10에서 변경: 키워드 전용 매개변수 encodingerrors가 추가됨. 버전 3.11에서 변경: 'rU''U' 모드와 __getitem__() 메서드가 제거됨.

선택적 제자리 필터링(in-place filtering): fileinput.input() 또는 FileInput 생성자에 키워드 인자 inplace=True를 전달하면, 파일이 백업 파일로 옮겨지고 표준 출력이 입력 파일로 향하게 돼요(백업 파일과 같은 이름의 파일이 이미 있으면 조용히 대체돼요). 그래서 입력 파일을 그 자리에서 다시 쓰는 필터를 작성할 수 있어요. backup 매개변수가 주어지면(보통 backup='.<some extension>') 백업 파일의 확장자를 지정하고, 백업 파일은 남아 있어요. 기본적으로 확장자는 '.bak'이고 출력 파일이 닫힐 때 삭제돼요. 표준 입력을 읽을 때는 제자리 필터링이 비활성화돼요.

이 모듈은 두 개의 열기 훅을 제공해요.

fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None)

gzipbz2 모듈을 사용해 확장자 '.gz''.bz2'로 식별되는 gzip·bzip2 압축 파일을 투명하게 열어요. 파일명 확장자가 '.gz''.bz2'가 아니면 파일을 정상적으로 열어요(즉, 압축 해제 없이 open() 사용).

encodingerrors 값은 압축 파일에는 io.TextIOWrapper로, 일반 파일에는 open으로 전달돼요.

사용 예: fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")

버전 3.10에서 변경: 키워드 전용 매개변수 encodingerrors가 추가됨.

fileinput.hook_encoded(encoding, errors=None)

각 파일을 주어진 encodingerrors로 읽어서 open()으로 여는 훅을 돌려줘요.

사용 예: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

버전 3.6에서 변경: 선택적 errors 매개변수 추가. 버전 3.10부터 폐기: fileinput.input()FileInput에 이제 encodingerrors 매개변수가 있으므로 이 함수는 폐기됨.