매우 큰 ascii 파일을 "매핑"하려고합니다. 기본적으로 특정 태그를 찾을 때까지 줄을 읽은 다음 해당 태그의 위치를 알고 나중에 관련 데이터를 꺼내기 위해 다시 찾을 수 있습니다.파일 객체의 버퍼 크기를 찾는 방법이 있습니까?
from itertools import dropwhile
with open(datafile) as fin:
ifin = dropwhile(lambda x:not x.startswith('Foo'), fin)
header = next(ifin)
position = fin.tell()
이제이 tell
이 올바른 위치를 제공하지 않습니다. 이 질문은 다양한 형태로 이전에 요청되었습니다. 그 이유는 아마도 파이썬이 파일 객체를 버퍼링하기 때문일 것입니다. 그래서 파이썬은 파일 포인터가 어디에 있는지 알려주고 파일 포인터는 어디에 있는지 알려줍니다. I don't want to turn off this buffering ... 여기 성능이 중요합니다. 그러나, 파이썬이 얼마나 많은 바이트를 버퍼링할지 결정하는 방법이 있는지를 아는 것이 좋다. 제 실제 적용에서, 제가 Foo
으로 시작하는 줄을 닫는 한 그것은 중요하지 않습니다. 나는 여기 저기에 몇 줄을 떨어 뜨릴 수있다. 버퍼 크기를 찾는 것에 대해 갈 수있는 방법이
position = fin.tell() - buffer_size(fin)
가있다 : 그래서, 실제로 일을 계획하고있어이 같은입니까?
여기서 ftell()을 사용하는 대신 건너 뛸 행의 길이를 합산합니다. –
@RussellBorogove - 원래 생각한 합리적인 접근 방식이지만, 단점은 '지느러미'에서 아무것도 읽지 않았다고 가정해야한다는 것입니다. 사실, 입력 매개 변수로'fin'을받는 함수에서 이것을 호출하려고합니다. – mgilson