как перебирать файлы в каталоге с несколькими папками, работать с файлами, сохранять в разные наборы папок

#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

  

Я надеюсь, что этот пример был достаточно простым для понимания, чтобы вы могли адаптировать его к своим потребностям.

Несколько советов:

  1. Рекомендуется использовать os.path.join для создания путей к файлам вместо конкатенации, поскольку он автоматически добавит соответствующий разделитель ОС, если он отсутствует. Если вы забудете убедиться, что папка и файл разделены, то запись будет выполнена в неправильном месте.
  2. 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. Большое спасибо; это действительно полезно. И, конечно, это сработало отлично.