Python os.rename () для файлов в нескольких подпапках в родительском каталоге - PullRequest
0 голосов
/ 07 июня 2018

Структура файла
У меня есть родительский каталог с именем test_folder, в котором есть несколько (приблизительно 600) подпапок.Каждая подпапка содержит следующее:

- всегда metadump.xml файл
- либо .pdf, .pptx, .xls, либо .docx файл

Цель
Я хотел бы переименовать соответствующий файл .pdf, .pptx, .xls или .docx в каждой подпапке моего родительского каталога (test_folder) на основе title информация из файла .xml в той же подпапке с именем banana в этом примере ниже.

import os

for root, dirs, files in os.walk("C:\\**\\Downloads\\test_folder"):
    for file in files:
        if file == 'metadump.xml':
            filename = os.path.join(root, file) 

            # READ XML FILE TO OBTAIN 'TITLE' INFORMATION
            with open(filename, 'r', encoding='utf-8') as xml_file:
                contents = xml_file.read()
                title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
                print(title) #AS A CHECK FOR SUCCESSFUL TITLE EXTRACTION

    # GOING THROUGH FILES AGAIN TO FIND NON-XML FILE
    for file in files:
        if file != 'metadump.xml':
            print(file) #CHECKING THE CORRECT FILE TO BE RENAMED IS SELECTED
            src = os.path.join(root, file) #ORIGINAL SOURCE PATH
            dst = os.path.join(root, title)#NEW DESTINATION PATH
            os.rename(src, dst) #TO RENAME FILES IN THE SUBFOLDER TO THE TITLE

После выполнения этого я получаю следующее:
Project Alpha <- Правильный заголовок был извлечен из XML <br>foobar.pdf <- Правильный «другой» файл в подпапке был выбран для переименования </p>

[WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\\**\\Downloads\\test_folder\\banana\\foobar.pdf' -> 'C:\\**\\Downloads\\test_folder\\banana\\Project Alpha'
Я не уверен, почемуЯ не могу переименовать другой файл, foobar.pdf с «заголовком», который был извлечен из файла .XML в той же подпапке.


Пример требуемого вывода
В test_folder родительском каталоге, в banana подпапке у нас есть:
Данные:
- foobar.pdf (общее имя файла)
- metadump.xml (в этомs файл, заголовок: Project Alpha можно извлечь)

Результат:
- Project_Alpha.pdf (имя pdf здесь было изменено)
- metadump.xml


Заранее спасибо за мысли!

1 Ответ

0 голосов
/ 07 июня 2018

Ваш отступ испорчен.Вы должны сначала прочитать XML, а затем переименовать другие файлы.См. Ниже.

import os

for root, dirs, files in os.walk(r"C:/**/Downloads/test_folder"):
    for file in files:
        if file == 'metadump.xml':
            filename = os.path.join(root, file) 

            with open(filename, 'r', encoding='utf-8') as f_xml:
                contents = f_xml.read()
                title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
                print(title) #AS A CHECK FOR SUCCESSFUL TITLE EXTRACTION

# NOW GO THROUGH YOUR FILES IN CURRENT DIRECTORY AGAIN
    for file in files:
        if file != 'metadump.xml':
            src = os.path.join(root, file)
            dst = os.path.join(root, title)
            os.rename(src, dst) #TO RENAME FILES IN THE SUBFOLDER TO THE TITLE

Или, еще лучше:

import os

for root, dirs, files in os.walk(r"C:/**/Downloads/test_folder"):
    # find xml file
    xmlFile = [r for r in files if r[-3:]=='xml']
    filename = os.path.join(root, xmlFile)

    with open(filename, 'r', encoding='utf-8') as f_xml:
        contents = f_xml.read()
        title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
        print(title) #AS A CHECK FOR SUCCESSFUL TITLE EXTRACTION

# NOW RENAME FILES
[os.rename(os.path.join(root, f), os.path.join(root, title)) for f in files if f[-3:]!='xml']

Я не вижу, где вы устанавливаете расширение файла, возможно, вам нужно иметь os.rename (file, title+ '.jpg') или что-то еще.

...