Я пытаюсь загрузить с помощью библиотеки 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.






Вы не справитесь с этой задачей, используя 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)
как вариант, это PR, открытый в ленгчейне: https://github.com/hwchase17/langchain/pull/5887/files