【问题标题】:Listing directory contents in Python在 Python 中列出目录内容
【发布时间】:2019-02-27 01:38:01
【问题描述】:

这里是 Python 新手,正在做一个示例练习以列出目录的内容,发现了一些我目前的知识水平无法解释的东西。

查看步骤 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

【问题讨论】:

  • 能否提供您正在测试的代码?
  • 您应该将代码复制并粘贴到您的问题中,而不是屏幕截图。它使阅读和搜索此问题变得更容易。
  • 在问题中添加了代码。

标签: python directory glob


【解决方案1】:

1 对 2

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

如果我们扩展第二个,我们得到

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

这不是一个有效的路径,所以它失败了。使用the slash operator 连接路径而不是直接操作字符串。

7. 您正在从“/”搜索。这意味着它使用的是绝对路径而不是相对路径。正如错误消息所说,这是不支持的。(“/”是 Linux 系统上的根目录。)

【讨论】:

  • 是的,为了完整起见,我添加了 2,因为这里有很多不同类型的结果。但是,您对 2 不存在的正斜杠是正确的。无论如何,这如何解释 3 和 4 之间的区别(其中为手动路径字符串创建添加了斜杠)
  • @Rupendra 我现在没有控制台可以玩,但我认为这是因为 glob 的参数是混合正斜杠和反斜杠。通过 pathlib 会自动为您处理。
猜你喜欢
  • 2011-02-15
  • 2010-12-16
  • 2015-02-02
  • 2013-12-07
  • 1970-01-01
  • 2019-01-11
  • 2011-06-10
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多