Извлечение имен каталогов из динамических путей к файлам в Python

Есть ли способ в Python извлечь каждый каталог файлов и файл в путь к файлу Windows с помощью REGEX и group() или os.path?

Я имею дело с путями к файлам, которые имеют разное количество каталогов, поэтому одна строка может быть D:\dir1\file.txt, а следующая может быть Z:\dir1\dir2\dir3\dir4\dir5\file.txt, поэтому мне интересно, есть ли вообще способ сделать это с помощью REGEX или встроенной функции в Python, когда в тексте, который я ищу, разное количество \.

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

После редактирования:

Я пытаюсь извлечь имена каталогов между \ и последним file.txt и записать каждый dir или file в свой столбец в выходном текстовом файле.

Мой желаемый результат для двух вышеупомянутых строк был бы следующим:

 col1|col2|col3|col4|col5|col6
 dir1|dir2|dir3|dir4|dir5|file.txt
 dir1|    |    |    |    |file.txt

Я знаю, что os.path имеет много хороших встроенных функций, но после прочтения этого сайта: https://docs.python.org/2/library/os.path.html, я не думаю, что кто-то из них делает то, что я пытаюсь сделать.


person pHorseSpec    schedule 15.07.2015    source источник
comment
Что именно вы пытаетесь извлечь? То есть, учитывая ваш второй пример (Z:\dir1\dir2\dir3\dir4\dir5\file.txt), что именно вы хотите?   -  person larsks    schedule 15.07.2015
comment
Что вы имеете в виду под extract each file directory and the file? Вы хотите хранить их отдельно в списке? Можете ли вы показать желаемый результат?   -  person Kamehameha    schedule 15.07.2015
comment
@larsks См. отредактированный вопрос   -  person pHorseSpec    schedule 15.07.2015
comment
@Kamehameha Я хочу взять каждое имя каталога между обратными косыми чертами ` as well as the file name and write each element to it's own column by having a bar | `между dir именами и именем файла. Я запишу их в выходной файл с разделителями |. Желаемый результат описан в отредактированном вопросе выше.   -  person pHorseSpec    schedule 15.07.2015


Ответы (1)


Вы можете разделить имя файла и каталог, используя:

splitFilePath = filePath.rsplit (']\', 1)
directory = splitFilePath [0]
fileName = splitFilePath [1]

Вы можете разделить все фрагменты символом '\', используя:

chunks = filePath.split (r'\')

Затем вы можете вырезать определенные фрагменты и склеить их подмножества с помощью соединения.

Использование столбцов, добавленных в отредактированный вопрос, предполагает, что вы знаете свой самый длинный путь для определения количества столбцов:

  • Разделить с помощью функции разделения, как описано выше
  • Найдите длину самого длинного списка
  • Вставьте пустые строки во все списки, но самую длинную перед последним элементом, чтобы списки были одинаковой длины.
  • Присоединяйтесь к ним, используя '|' используя функцию соединения

В ответ на ваш комментарий:

Запуск следующей программы

filePath = r'E:\dir1\Logs\dir2\1998-12-23\message.txt'
splitFilePath = filePath.rsplit ('\\', 1)
directory = splitFilePath [0]
fileName = splitFilePath [1]
print directory
print fileName

дает как результат

E:\dir1\Logs\dir2\1998-12-23
message.txt

Так что '\\' вместо '\' в rsplit.

person Jacques de Hooge    schedule 15.07.2015
comment
Когда я запускаю filename2 = splitFilePath[1] против строки E:\dir1\Logs\dir2\1998-12-23\message.txt, я получаю следующую ошибку: IndexError: list index out of range. Кроме того, регулярное выражение для поиска ` равно (r'\\') - person pHorseSpec; 16.07.2015
comment
Я исправил и протестировал пример, не используйте r '\\', а просто '\\'. - person Jacques de Hooge; 16.07.2015
comment
Потрясающие! Это работает, и когда я print(directory.split("\\"): ['E:', 'dir1', 'Logs', 'dir2', '1998-12-23'], я получил следующий результат. - person pHorseSpec; 16.07.2015