Проблема с загрузкой онлайн-pdf в блокнот Python с использованием langchain PyPDFLoader

Я пытаюсь загрузить с помощью библиотеки Python langchain онлайн-файл в формате PDF из: http://datasheet.octopart.com/CL05B683KO5NNNC-Samsung-Electro-Mechanics-datasheet-136482222.pdf

Это код, который я запускаю локально:

loader = PyPDFLoader(datasheet_path)
pages  = loader.load_and_split()
Am getting the following error
---------------------------------------------------------------------------
PermissionError                           Traceback (most recent call last)
Cell In[4], line 8
      6 datasheet_path = "http://datasheet.octopart.com/CL05B683KO5NNNC-Samsung-Electro-Mechanics-datasheet-136482222.pdf"
      7 loader = PyPDFLoader(datasheet_path)
----> 8 pages = loader.load_and_split()
     11 query = """

File ***\.venv\lib\site-packages\langchain\document_loaders\base.py:36, in BaseLoader.load_and_split(self, text_splitter)
     34 else:
     35     _text_splitter = text_splitter
---> 36 docs = self.load()
     37 return _text_splitter.split_documents(docs)
...
   (...)
    114         for i, page in enumerate(pdf_reader.pages)
    115     ]

PermissionError: [Errno 13] Permission denied: 'C:\\Users\\****\\AppData\\Local\\Temp\\tmpu_59ngam'

Примечание 1: запуск того же кода в Google Colab работает хорошо. Примечание 2: запуск следующего кода в том же блокноте работает правильно, поэтому я не уверен, что доступ к временной папке каким-либо образом проблематичен:

with open('C:\\Users\\benis\\AppData\\Local\\Temp\\test.txt', 'w') as h:
    h.write("test")

Примечание 3: я протестировал несколько различных онлайн-файлов в формате pdf. получил ту же ошибку для всех.

Код должен преобразовывать pdf в текст и разбивать на страницы с помощью Langchain и pyplot.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
496
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не справитесь с этой задачей, используя langchain в окнах с их текущей реализацией. Вы можете взглянуть на исходный код здесь. Рассмотрим следующий сокращенный код:

class BasePDFLoader(BaseLoader, ABC):
    def __init__(self, file_path: str):
        ...
        # If the file is a web path, download it to a temporary file, and use that
        if not os.path.isfile(self.file_path) and self._is_valid_url(self.file_path):
            r = requests.get(self.file_path)

            ...
            self.web_path = self.file_path
            self.temp_file = tempfile.NamedTemporaryFile()
            self.temp_file.write(r.content)
            self.file_path = self.temp_file.name
            ...

    def __del__(self) -> None:
        if hasattr(self, "temp_file"):
            self.temp_file.close()

Обратите внимание, что они открывают файл в конструкторе и закрывают его в деструкторе. Теперь давайте посмотрим на документацию по python на NamedTemporaryFile (акцент мой, документы предназначены для python3.9):

Эта функция работает точно так же, как и TemporaryFile(), за исключением того, что имя файла гарантированно будет видимым в файловой системе (в Unix запись в каталоге не разрывается). Это имя можно получить из атрибута имени возвращаемого файлового объекта. Можно ли использовать это имя для открытия файла во второй раз, пока именованный временный файл все еще открыт, зависит от платформы (его можно использовать в Unix, но нельзя в Windows).

Обновите файл pdf.py (https://github.com/hwchase17/langchain/blob/5cfa72a130f675c8da5963a11d416f553f692e72/langchain/document_loaders/pdf.py#L65) и сделайте NamedTemporaryFile недоступным для удаления (до закрытия приложения)

self.temp_file = tempfile.NamedTemporaryFile(delete=False)

Ссылка: https://stackoverflow.com/questions/3924117/how-to-use-tempfile-namedtemporaryfile-in-python#:~:text=To%20fix%20this%20use%3A%20tf%20%3D %20tempfile.NamedTemporaryFile%20%28delete%3DFalse%29, выиграл%27t%20let%20you%20open%20it%20используя%20другое%20приложение.

как вариант, это PR, открытый в ленгчейне: https://github.com/hwchase17/langchain/pull/5887/files

Другие вопросы по теме