Python os.walk отображает смешанные окна и пути Unix - PullRequest
0 голосов
/ 26 ноября 2018

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

for paths, subdirs, files in os.walk(start_dir, topdown=True):
    for file in files:
        print(os.path.join(paths, file))

Моя проблема связана с выводом этого кода на машину Windows, в основном динамические части пути имеют неправильный знак косой черты:

D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\AesSheetNumberEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentReceivedDetailEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentReceivedEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentTypeEntity.java

указана начальная папка:

D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim

и разделитель папок unix one: "/"

, в то время как все последующие подпапки, найденные функцией os.walk, имеют косую черту в Windowsвместо этого: "\"

Итак, в конце у меня неверный путь, который нельзя использовать сразу.Это ошибка в библиотеке Python OS или что на самом деле?

В настоящее время я могу легко заменить неправильный разделитель на правильный, но мне интересно, если это единственный способ?

1 Ответ

0 голосов
/ 26 ноября 2018

Здесь нет реальной проблемы.Windows поддерживает два разделителя пути ;прямая и обратная косая черта действительны и поддерживаются, даже если они смешаны.Одним из них является os.sep (\), а другим - os.altsep (/).

os.path.join() user os.sep для объединения путей, но не заменяет os.altsep во входных путях.os.walk() просто использует os.path.join() для создания первого элемента каждого (path, files, directories) кортежа, который он генерирует

Если это вас беспокоит, нормализует ваши пути, используя os.path.normpath()function :

В Windows преобразует прямую косую черту в обратную косую черту.

Так что нормализуйте путь, передаваемый в os.walk():

for paths, subdirs, files in os.walk(os.path.normpath(start_dir), topdown=True):
    for file in files:
        full_path = os.path.join(paths, file)
        print(full_path)

или нормализовать пути, сгенерированные в цикле:

for paths, subdirs, files in os.walk(start_dir, topdown=True):
    for file in files:
        full_path = os.path.join(paths, file)
        normalised = os.path.normpath(full_path)
        print(normalised)

или нормализовать входную строку:

...