Вывод содержимого каталога в Python - PullRequest
0 голосов
/ 23 сентября 2018

Новичок в Python здесь, и я делал пример упражнения, чтобы составить список содержимого каталога, и нашел то, что я не могу объяснить своим текущим уровнем знаний. enter image description here

Глядя нашаги 1,3 и 2,4, мы видим, что результаты идентичны, однако результаты не одинаковы между 1,2 и 3,4.

5 и 6 идентичны, но не расширяются в дочернюю папку, и я считаю, что это просто проблема с текстом глобуса.

Но тогда 7 бросков и ошибка и 8 дают правильные результаты!

Как мы можем объяснить вышеуказанные результаты?

Платформа: Windows 10 Python Версия: 3.6.5

Код показан ниже

import MainMenu
from pathlib import Path
import glob


def main():
    menu = MainMenu.MainMenu()
    operation, result = menu.show_main_menu()

    if operation == 1:
        # user chose file listing - result has to be path of the folder
        p = Path(result)
        print("result =", result)
        print("p.resolve() =", p.resolve())
        print("1. list(p.resolve().glob(\"./**/*\")):", list(p.resolve().glob("./**/*")))
        print("2. glob.glob(result + \"./**/*\"):", glob.glob(result + "./**/*"))
        print("3. list(p.resolve().glob(\"**/*\")):", list(p.resolve().glob("**/*")))
        print("4. glob.glob(result + \"/**/*\"):", glob.glob(result + "/**/*"))
        print("5. list(p.resolve().glob(\"**\")):", list(p.resolve().glob("**")))
        print("6. glob.glob(result + \"**\"):", glob.glob(result + "**"))
        print("7. list(p.resolve().glob(\"/**\")):", "Error: Non-relative patterns are unsupported")
        print("8. glob.glob(result + \"/**\"):", glob.glob(result + "/**"))

if __name__ == '__main__':
    main()

Ниже приведен класс MainMenu

from __future__ import unicode_literals, print_function
from prompt_toolkit import print_formatted_text
from prompt_toolkit.formatted_text import HTML, ANSI
from prompt_toolkit.formatted_text import FormattedText
from prompt_toolkit.shortcuts import prompt
from prompt_toolkit.validation import Validator
from pathlib import Path


class MainMenu:

    @staticmethod
    def __menu_title(text):
        print_formatted_text(HTML('\n<u><b>{}</b></u>').format(text))

    @staticmethod
    def __validator_is_valid_choice(text):
        return text == '1'

    @staticmethod
    def __validator_is_valid_folder_path(text):
        p = Path(text)
        return (p.exists() and p.is_dir())


    def __init__(self):
        self.validator_is_valid_choice = Validator.from_callable(
            self.__validator_is_valid_choice,
            error_message='Not a valid choice (has to be the number from 1).',
            move_cursor_to_end=False)
        self.validator_is_valid_folder_path = Validator.from_callable(
            self.__validator_is_valid_folder_path,
            error_message='Please specify a valid path to a folder.',
            move_cursor_to_end=False)

    def show_main_menu(self):
        tokens = FormattedText([('bg:ansigreen ansiwhite', 'Choose option: ')])
        self.__menu_title('Please select the file operation')
        print_formatted_text(ANSI('    \x1b[1m1. List Files'))
        result = prompt(tokens, refresh_interval=.5, validator=self.validator_is_valid_choice, validate_while_typing=True)

        if result == '1':
            print_formatted_text('')
            return 1, self.show_enter_path_menu()
        else:
            return 0

    def show_enter_path_menu(self):
        tokens = FormattedText([('bg:ansigreen ansiwhite', 'Enter the folder path: ')])
        result = prompt(tokens, refresh_interval=.5, validator=self.validator_is_valid_folder_path, validate_while_typing=True)
        return result

1 Ответ

0 голосов
/ 23 сентября 2018

1 против 2

list(p.resolve().glob("./**/*"))
glob.glob(result + "./**/*")

Если развернуть второй, мы получим

glob.glob("C:\Python\PlayTest\testfolder./**/*")

Это неверный путь, поэтому он не работает.Используйте оператор косой черты для объединения путей вместо непосредственного манипулирования строкой.

7. Вы ищете из "/".Это означает, что он использует абсолютный путь вместо относительного пути.Как говорится в сообщении об ошибке, это не поддерживается. ("/" Является корневым каталогом в системах Linux.)

...