-
[트러블 슈팅] 파일을 읽을 수 없는 문제 (feat: 포인터)트러블 슈팅 2025. 1. 1. 22:55
트러블 슈팅: 파일을 읽을 수 없는 문제 해결
문제 개요:
클로바 OCR API를 호출하여 이미지를 처리하는 과정에서 업로드된 이미지 파일을 읽을 때, 파일이 제대로 읽히지 않는 문제가 발생했습니다. 파일 크기는 정상적으로 출력되었으나 file.read() 호출 후 contents가 빈 바이트 문자열(b'')로 반환되어, OCR 처리가 제대로 진행되지 않았습니다.
async def _call_clova_ocr(self, file: UploadFile): """ OCR API를 호출하여 이미지에서 텍스트를 추출합니다. Args: file (UploadFile): 업로드할 이미지 파일 Returns: list: 추출된 텍스트 목록 """ print('여기', file) try: contents = await file.read() print('요기', contents)
처음에는 try 안에서 file size가 0이라 process_images를 호출하는 쪽에서 file size가 얼마인지 확인했다. 하지만 정상적으로 뿌려줬다. 따라서 try 전 file size와 이후 file size가 다름을 깨달았다. 즉, 여기와 요기
문제 발생 원인:
문제의 원인은 UploadFile 객체의 file 속성에서 발생했습니다. file.read()는 파일의 내용을 읽기 위해 사용되는데, 파일 포인터가 이미 해당 위치에서 데이터를 읽은 뒤였기 때문에, 파일 포인터가 끝까지 가 있었습니다. 이는 file.read()가 빈 값을 반환하게 만든 원인입니다.
해결 과정:
- 파일 포인터 위치 확인:
- file.read() 호출을 하기 전에, 파일 포인터가 처음부터 시작되도록 해야 했습니다. 그렇지 않으면 이미 파일에서 읽은 데이터 이후부터 읽게 되어 빈 데이터를 읽는 문제가 발생합니다.
- 파일 포인터 초기화:
- 이를 해결하기 위해 file.file.seek(0)을 호출하여 파일 포인터를 처음 위치로 되돌리도록 했습니다. seek(0)을 호출하면 파일 포인터가 파일의 맨 처음으로 돌아가게 되어, 다시 데이터를 정상적으로 읽을 수 있습니다.
async def _call_clova_ocr(self, file: UploadFile): """ OCR API를 호출하여 이미지에서 텍스트를 추출합니다. Args: file (UploadFile): 업로드할 이미지 파일 Returns: list: 추출된 텍스트 목록 """ print('file parameter in call_clova_ocr', file) try: file.file.seek(0) contents = await file.read() print('contents 입니다.', contents)
변경된 코드 흐름:
- file.read() 전에 file.file.seek(0)을 호출하여 파일 포인터를 초기화했습니다.
- 그 후, 파일을 file.file.read()로 동기적으로 읽어 contents 변수에 저장했습니다.
- 정상적으로 파일이 읽힌 후, 그 파일의 크기 및 내용을 확인하고 필요한 처리(파일 크기 검증 및 OCR API 호출 등)를 진행했습니다.
결론:
파일 포인터를 초기화하고 다시 읽기 시도하는 방식으로 문제를 해결했습니다. file.read() 호출 전에 seek(0)을 사용함으로써 정상적으로 파일을 읽을 수 있었고, 이후 OCR 처리가 정상적으로 이루어졌습니다.
회고:
트러블 슈팅의 쾌감을 느꼈습니다. PintOS를 하면서 탑 다운하면서 디버깅 했던 게 도움이 됐습니다. 특히 특정 함수에서 문제가 있는 줄 알았지만, pdf, 로깅, 그리고 print()를 찍어가며 하나씩 문제를 찾아내며 문제에 한 걸음씩 다가가 문제가 구체화되고 점점 해결되는 과정에서 특히 쾌감을 느꼈습니다.
'트러블 슈팅' 카테고리의 다른 글
[C] gcc 컴파일러 한글 깨짐 (0) 2024.10.04 노션 무한로딩 (2) 2024.09.07 백준허브 빨간색 체크 해결 (0) 2024.09.07 Github push 시 "remote Repository not found" 오류 (0) 2024.09.04 - 파일 포인터 위치 확인: