Как вы и предполагали, glob
прекрасно работает здесь. Он даже может фильтровать только .pdf
файлы.
Раскомментируйте 3 строки после того, как вы его протестировали.
import os, glob
def convert_multiple(pdf_dir, txt_dir):
if pdf_dir == "": pdf_dir = os.getcwd() # If no pdf_dir passed in
for filepath in glob.iglob(f"{pdf_dir}/**/*.pdf", recursive=True):
text = convert(filepath)
root, _ = os.path.splitext(filepath) # Remove extension
txt_filepath = os.path.join(txt_dir, os.path.relpath(root, pdf_dir)) + ".txt"
txt_filepath = os.path.normpath(txt_filepath) # Not really necessary
print(txt_filepath)
# os.makedirs(os.path.dirname(txt_filepath), exist_ok=True)
# with open(txt_filepath, "wt") as f:
# f.write(text)
pdf_dir = r"C:/Users/Documents/pdf/"
txt_dir = r"C:/Users/Documents/txt/"
convert_multiple(pdf_dir, txt_dir)
Чтобы определить путь к файлу для нового файла .txt
, используйте функции из модуля os.path
.
os.path.relpath(filepath, pdf_dir)
возвращает путь к файлу файла, включая любые подкаталоги, относящиеся к pdf_dir
.
Предположим, filepath
:
C:/Users/Documents/pdf/Setec Astronomy/employees.pdf
и pdf_dir
равно
C:/Users/Documents/pdf/
Возвращается Setec Astronomy/employees.pdf
, которое затем может быть передано в os.path.join()
вместе с txt_dir
, что дает нам полный путь к файлу с включенными дополнительными подкаталогами.
Вы можете сделать txt_filepath = filepath.replace(filepath, pdf_dir)
, но вы должны убедиться, что все соответствующие косые черты в одном направлении, и там нет лишних / отсутствующих начальных / конечных слешей.
Перед открытием нового файла .txt
необходимо создать все подкаталоги. os.path.dirname()
вызывается для получения пути к файлу каталога файла, а os.makedirs()
с аргументом exist_ok
, установленным на True
, для подавления исключения FileExistsError
, если каталог уже существует.
A Оператор with
используется при открытии файла .txt
, чтобы избежать явного вызова .close()
, особенно в случае каких-либо исключений.