Каков правильный способ ввода каталога с пробелами от пользователя? (Питон3)

Я пытаюсь выбрать путь к каталогу через пользовательский ввод, а затем пройтись по каталогам с помощью os.walk(). Моя программа ломается, если я пытаюсь ввести путь с пробелами (например, «Пользователи/Пользователь/Папка с пробелом/Папка/»).

Как правильно ввести каталог с пробелами от пользователя? (Питон3)

Мой код выглядит примерно так:

fileDirectory = input("Enter in a path to import")

try:
    for root, dirs, files in os.walk(shlex.quote(fileDirectory)):
            for f in files:
                print(f)
                fileLocation = os.path.join(root, f) #Saves the path of the file
                print(fileLocation)
                size = os.path.getsize(fileLocation) #Gets the file size
                print(size)
                filePath, fileExt = os.path.splitext(fileLocation) #splits path and     extension, defines two variables
                print(fileExt)
                print(filePath)
except Exception as msg:
print(msg)

person user3650905    schedule 19.05.2014    source источник
comment
Как и где именно ломается? Я только что провел тест, в котором распечатал root dirs и files и не нашел ошибок в Python 3.4.   -  person merlin2011    schedule 19.05.2014
comment
Программа запускается, когда нет пробелов, а там, где в каталоге есть пробелы, она просто завершается. Я попытался обработать ошибку с помощью предложения try/except, но для «исключения» ничего не печатается. Извините, у меня нет больше информации.   -  person user3650905    schedule 19.05.2014
comment
Можете ли вы описать, для чего предназначен ваш some code?   -  person merlin2011    schedule 19.05.2014
comment
Одна часть кода предназначена для печати атрибутов каждого файла. вот один пример: 'для f в файлах: print(f) fileLocation = os.path.join(root, f) #Сохраняет путь к файлу print(fileLocation) size = os.path.getsize(fileLocation) #Получает размер файла print(size) filePath, fileExt = os.path.splitext(fileLocation) # разделяет путь и расширение, определяет две переменные print(fileExt) print(filePath)'   -  person user3650905    schedule 19.05.2014
comment
Пожалуйста, обновите свой вопрос. ТАК комментарии не поддерживают новые строки!   -  person merlin2011    schedule 19.05.2014
comment
@ user3650905: вы можете отредактировать свой вопрос, чтобы предоставить новую информацию, например добавить код с правильным форматированием.   -  person jfs    schedule 01.08.2014


Ответы (2)


Рассмотрите возможность использования shlex.quote.

В этом случае вы хотели бы:

for root, dirs, files in os.walk(shlex.quote(fileDirectory)):
    #some code...
person Cargo23    schedule 19.05.2014
comment
Вы не должны использовать shlex.quote(). Просто передайте путь к каталогу напрямую: os.walk(fileDirectory). Неважно, есть ли в нем пробелы. - person jfs; 01.08.2014

Создайте отдельную функцию, которая возвращает вам действующий каталог:

import os

def get_directory_from_user(prompt='Input a directory path'):
    while True:
        path = input(prompt)
        if os.path.isdir(path):
            return path
        print('%r is not a directory. Try again.' % path)

Неважно, есть ли в path пробелы или нет. Просто передайте его os.walk() как есть:

for dirpath, dirnames, files in os.walk(get_directory_from_user()):
    ...
person jfs    schedule 01.08.2014