#python #os.walk
#python #os.walk
Вопрос:
Я хочу перебирать файлы pdf во всех папках в каталоге, работать с этими файлами (извлекать текст, сохранять в .txt), затем сохранять все текстовые файлы в другой набор папок с теми же именами, но в другом каталоге. Функция выполняется по назначению, но не с подпапками. Я понимаю, что есть ОС.прогулка, но я не уверен, как ее использовать здесь. Функция работает, если у меня есть все файлы без вложенных папок; он записывает в нужный каталог. Но мне нужно просмотреть папки, сохранить в эти папки в другом каталоге.
Нашли файлы в одном каталоге, обработали, сохранили в другом. Пробую ОС.прогулка, но не удалось успешно включить структуру папок.
структура папок в основном path / folder1 …folderN
У вас более 30 тысяч файлов, поэтому вы хотите сохранить систему папок.
def convertall(pdfDir, txtDir):
if pdfDir == "": pdfDir = os.walk(path) "\"
for pdf in os.listdir(pdfDir): --- tried os.walk here too;
fileExtension = pdf.split(".")[-1]
if fileExtension == "pdf":
pdfFilename = pdfDir pdf
text = convert(pdfFilename)
textFilename = txtDir pdf ".txt"
textFile = open(textFilename, "w")
textFile.write(text)
pdfDir = pdfpath
txtDir = txtpath
convertall(pdfDir)
Планирую сделать это для различных операций, поэтому надеюсь узнать какое-то общее решение.
Комментарии:
1. Можете ли вы показать свою
os.walk
попытку? Если вы хотите рекурсивно просматривать кучу папок, это определенно правильный путь.
Ответ №1:
os.walk
вызывается с topdown=True
помощью возвращает кортеж на каждой итерации в формате (this_directory_path, directories_in_this_directory, files_in_this_directory)
. Второй и третий элементы кортежа — это списки, что означает, что вам также придется перебирать их. Итак, вы можете просмотреть структуру каталогов следующим образом:
import os
def create_my_new_path(old_root)
# This gives us everything after /home/user/PDFs, e.g. folderN
relative_path = os.path.relpath(old_root, "/home/user/PDFs")
# This returns "/home/user/TXTs/folderN"
return os.path.join("/home/user/TXTs", relative_path)
for root, directories, files in os.walk("/home/user/PDFs", topdown=True):
for pdf_filename in files:
# Use .lower() for the comparison in case there are files that end in ".PDF"
if pdf_filename[-4:].lower() == ".pdf":
# the variable `root` may not contain the absolute path
# depending on what you passed to os.walk, so you might
# want to use os.path.abspath(root) before passing it
# to the path builder
txt_save_dir = create_my_new_path(root)
txt_filename = "".join(old_filename[:-4], ".txt")
result = parse_PDF(os.path.join(root, filename))
with open(os.path.join(txt_save_dir, txt_filename), "w") as f:
f.write(result)
for directory in directories:
# If you wanted to do something with the subfolders too, you could do it here
continue
Я надеюсь, что этот пример был достаточно простым для понимания, чтобы вы могли адаптировать его к своим потребностям.
Несколько советов:
- Рекомендуется использовать
os.path.join
для создания путей к файлам вместо конкатенации, поскольку он автоматически добавит соответствующий разделитель ОС, если он отсутствует. Если вы забудете убедиться, что папка и файл разделены, то запись будет выполнена в неправильном месте. with open(path, mode) as myfile:
это хороший способ открывать файлы, потому что он автоматически закроет файл в концеwith
предложения для вас, даже если генерируются исключения. Вот как официальное руководство по python рекомендует вам открывать файлы сейчас. https://docs.python.org/3.7/tutorial/inputoutput.html#reading-and-writing-files
Вот все os.path
операции: https://docs.python.org/3/library/os.path.html
Использование для os.walk
можно найти здесь: https://docs.python.org/3/library/os.html
Комментарии:
1. Большое спасибо; это действительно полезно. И, конечно, это сработало отлично.