RegEx, чтобы найти конкретный путь к файлу - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь найти существование файла testing.txt

Первый файл существует в: sub/hbc_cube/college/

Второй файл существует в: sub/hbc/college

Однако при поиске того, где находится файл, I CANNOT принимает строку 'hbc', поскольку имя может отличаться в зависимости от пользователя. Поэтому я пытаюсь найти способ

PASS , если путь

суб / _cube / колледж /

FAIL , если путь

суб / * / колледж

Но я не могу использовать символ глобуса (), потому что () будет считать _cube неудачным. Я пытаюсь определить регулярное выражение, которое будет определять только строку, а не строку с подчеркиванием (например, hbc_cube).

Я пытался использовать словарь регулярных выражений python, но я не смог найти правильное регулярное выражение для использования

file_list = lookupfiles(['testing.txt'], dirlist = ['sub/'])
for file in file_list:
     if str(file).find('_cube/college/') #hbc_cube/college
            print("pass")
     if str(file).find('*/college/')     #hbc/college
            print("fail")

Если файл существует в обоих местах, я хочу только "не удалось" распечатать. Проблема в том, что * символ считает hbc_cube.

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Модуль glob - ваш друг. Вам даже не нужно сопоставлять несколько каталогов, glob сделает это за вас:

from glob import glob

testfiles = glob("sub/*/testing.txt")

if len(testfiles) > 0 and all("_cube/" in path for path in testfiles):
    print("Pass")
else:
    print("Fail")

Если это не очевидно, тест all("_cube/" in path for path in testfiles) позаботится об этом требовании:

Если файл существует в обоих местах, я хочу только "не удалось" распечатать. Проблема в том, что * символ считает hbc_cube.

Если некоторые из совпавших путей не содержат _cube, тест не пройден. Так как вы хотите узнать о файлах, которые приводят к тому, что тест не удастся , вы не можете искать только файлы по пути, содержащему *_cube - вы должны извлечь как хорошие, так и плохие пути и проверить их, как показано.

Конечно, вы можете сократить приведенный выше код или обобщить его, чтобы создать глобальный путь, комбинируя параметры из списка папок, списка файлов и т. Д., В зависимости от особенностей вашего случая.

Обратите внимание, что существуют "полные регулярные выражения", предоставляемые модулем re, и более простые "глобусы", используемые модулем glob. Если вы идете проверить документацию, не путайте их.

0 голосов
/ 28 марта 2019

Используйте pathlib для анализа вашего пути, из объекта path получите родительский элемент, это отбросит часть /college и проверит, заканчивается ли строка пути на _cube

from pathlib import Path

file_list = lookupfiles(['testing.txt'], dirlist = ['sub/'])
for file in file_list:
     path = Path(file)
     if str(path.parent).endswith('_cube'):
         print('pass')
     else:
         print('Fail')

Edit:

Если переменная file в цикле for содержит имя файла (sub/_cube/college/testing.txt), просто дважды вызовите parent в пути, path.parent.parent

Другой подход заключается в фильтрации файлов внутри lookupfiles(), то есть если у вас есть доступ к этой функции и вы можете редактировать ее

0 голосов
/ 28 марта 2019

Модуль os хорошо подходит для этого:

import os

# This assumes your current working directory has sub in it
for root, dirs, files in os.walk('sub'):
    for file in files:
        if file=='testing.txt':
            # print the file and the directory it's in
            print(root + file)

os.walk вернет трехэлементный кортеж при его итерации: корневой каталог, каталоги в этой текущей папке и файлы в этой текущей папке. Чтобы распечатать каталог, вы объединяете корень (cwd) и имя файла.

Например, на моей машине:

for root, dirs, files in os.walk(os.getcwd()):
     for file in files:
             if file.endswith('ipynb'):
                     print(root + file)


# returns
/Users/mm92400/Salesforce_Repos/DataExplorationClustersAndTime.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationUntitled1.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationExploratory.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationUntitled3.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationUntitled.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationUntitled4.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationUntitled2.ipynb
/Users/mm92400/Salesforce_Repos/DataExplorationClusterAnalysis.ipynb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...