Как создать список файлов с относительным путем к файлам в Python? - PullRequest
0 голосов
/ 29 июня 2018

Итак, я пишу инструмент cli, который берет файл и вычисляет контрольную сумму (CRC32) для этого файла. Я хочу, чтобы мой инструмент имел опцию рекурсия . Поэтому я хочу получить список всех файлов в каталоге, чтобы я мог передать его в качестве параметра моему методу контрольной суммы.

Примечание: 'Test Dir /' - это каталог в той же папке, что и скрипт, и вводится через терминал, а не через переменную set.

Пока у меня есть:

rootDir = ['Test Dir/']
files = []

for i in rootDir:
    if not os.path.isdir(i):
       files.append(i)
    else:
        for dir_, _, files in os.walk(i):
            for fileName in files:
                relDir = os.path.relpath(dir_, i)
                relFile = os.path.join(relDir, fileName)
                files.append(relFile)

Возвращает:

['./root.py', './root.txt', 'Lv1/lv1.py', 'Lv1/lv1.pyc', 'Lv1/lv1.txt', 'Lv1/Lv2/lv2.pyc', 'Lv1/Lv2/lv2.py', 'Lv1/Lv2/lv2.txt', 'Lv1/Lv2/Lv3/lv3.txt', 'Lv1/Lv2/Lv3/lv3.py', 'Lv1/Lv2/Lv3/lv3.pyc']

Но если я введу rootDir как «Test Dir / *», я получу:

['./lv1.py', './lv1.pyc', './lv1.txt', 'Lv2/lv2.pyc', 'Lv2/lv2.py', 'Lv2/lv2.txt', 'Lv2/Lv3/lv3.txt', 'Lv2/Lv3/lv3.py', 'Lv2/Lv3/lv3.pyc', 'Test Dir/root.py', 'Test Dir/root.txt']

те же файлы, но немного другой список.

То, что я хочу, это: ['Test Dir/root.py', 'Test Dir/root.txt', 'Test Dir/Lv1/lv1.py', 'Test Dir/Lv1/lv1.pyc', 'Test Dir/Lv1/lv1.txt', 'Test Dir/Lv1/Lv2/lv2.pyc', 'Test Dir/Lv1/Lv2/lv2.py', 'Test Dir/Lv1/Lv2/lv2.txt', 'Test Dir/Lv1/Lv2/Lv3/lv3.txt', 'Test Dir/Lv1/Lv2/Lv3/lv3.py', 'Test Dir/Lv1/Lv2/Lv3/lv3.pyc']

Теперь я знаю, что могу сделать это, используя манипуляции со строками, но это не кажется очень чистым ... Очень надеюсь, что кто-нибудь поможет мне с этим.

1 Ответ

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

Способ работы os.path.relpath состоит в том, что он будет включать только имена путей под заданным базовым путем, поэтому, если вы хотите, чтобы ваш окончательный список включал в себя имя базового пути, вам на самом деле не нужно os.path.relpath для начала с.

Кроме того, переменная files, которую вы используете для цикла for, скрывает список files, который вы инициализировали в начале и использовали в цикле for. Ваш код на самом деле не завершится, потому что вы продолжаете добавлять в список, используя его в качестве итератора. Вы должны назвать это как-нибудь еще.

Ваш код должен быть исправлен примерно так:

rootDir = ['Test Dir/']
paths = []

for i in rootDir:
    if not os.path.isdir(i):
       paths.append(i)
    else:
        for dir_, _, files in os.walk(i):
            for fileName in files:
                paths.append(os.path.join(i, fileName))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...