Формирование path c помощью os.path.join

Рейтинг: 0Ответов: 3Опубликовано: 03.02.2023

Подскажите все ли корректно при формировании path c помощью os.path.join по получаю обратный слеш перед именем файла. Как сделать что бы путь был корректный виндовый.

 with os.scandir(dirname) as files:
            for file in files:
               if file.is_file():
                   print(os.path.join(dirname, file.name))

Результат:

C:/Users/Пользователь/Desktop/XXXXX\icon.ico

Ответы

▲ 0Принят

Всем спасибо.

Как правильно заметил vitidev, действительно получается слеши слева не "виндовые", я их получаю из

dirname = QFileDialog.getExistingDirectory(self, "Выберите каталог с исходными файлами")

добавил

dirname = QtCore.QDir.toNativeSeparators(dirname)

Теперь путь стал красивым:

C:\Users\Пользователь\Desktop\XXXXX\icon.ico
▲ 2

Я бы перешел на pathlib

Тут сразу будет путь от директории:

from pathlib import Path

...

for file in Path(dirname).iterdir():
    if file.is_file():
        print(file)

Если нужно путь сложить, то это можно сделать через оператор /, типа:

file_name = '1.txt'
path = Path(dirname) / 'src' / file_name

А направление слэша (/ или \) будет от текущей системы учитываться

Единственное то, что file будет не строкой, а объектом со своими полями и методами, питоничьи функции из коробки (типа open, os.path.*, shututil.*) умеют с ним работать, но если нужно получить именно строку, то нужно в str оборачивать: str(file)

▲ 0

Как вариант, можно сделать так:

os.path.join(os.getcwd(), os.path.basename(filename))

Получаем текущую папку, затем берём название файла и соединяем в единый путь. Получать папку необязательно, главное корректно получить путь к ней, например: os.path.normpath(path)

Т.е. в вашем случае получится так:

dirname = os.path.normpath(dirname)
with os.scandir(dirname) as files:
        for file in files:
           if file.is_file():
               print(os.path.join(dirname, os.path.basename(file.name)))

И как уже отметили, можно действительно воспользоваться Pathlib.