ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [트러블 슈팅] 파일을 읽을 수 없는 문제 (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()가 빈 값을 반환하게 만든 원인입니다.

    해결 과정:

    1. 파일 포인터 위치 확인:
      • file.read() 호출을 하기 전에, 파일 포인터가 처음부터 시작되도록 해야 했습니다. 그렇지 않으면 이미 파일에서 읽은 데이터 이후부터 읽게 되어 빈 데이터를 읽는 문제가 발생합니다.
    2. 파일 포인터 초기화:
      • 이를 해결하기 위해 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)

    변경된 코드 흐름:

    1. file.read() 전에 file.file.seek(0)을 호출하여 파일 포인터를 초기화했습니다.
    2. 그 후, 파일을 file.file.read()로 동기적으로 읽어 contents 변수에 저장했습니다.
    3. 정상적으로 파일이 읽힌 후, 그 파일의 크기 및 내용을 확인하고 필요한 처리(파일 크기 검증 및 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
Designed by Tistory.