Glob 不返回指定目录中的文件列表

问题描述

我在 Stack Overflow 上的其他帖子中找到了两种列出指定目录中文件方法,但我似乎无法让它们工作。第一个返回路径,第二个返回我正在查找的文件以及路径。我尝试了多种方法,例如重命名目标目录和文件,但似乎并没有奏效。

有问题的代码

import glob

jpgFilenamesList = glob.glob(r"C:\Users\viodo\PycharmProjects\pythonProject")
print(jpgFilenamesList)

mydir = r"C:\Users\viodo\PycharmProjects\pythonProject"

file_list = glob.glob(mydir + "/*.jpg")
print(file_list)

我得到了什么:

['C:\\Users\\viodo\\PycharmProjects\\pythonProject']
['C:\\Users\\viodo\\PycharmProjects\\pythonProject\\dngjknfjkg.jpg','C:\\Users\\viodo\\PycharmProjects\\pythonProject\\fjkdnfkl.jpg','C:\\Users\\viodo\\PycharmProjects\\pythonProject\\skdklenfkd.jpg']

在另一个线程中找到的解决方案:Python glob multiple filetypes

一些调整让它运行顺畅。感谢您的帮助!

解决方法

Glob 返回相对于根目录的路径名列表。除非指定的 glob 模式是绝对路径,否则假定该根目录是您当前的工作目录。总之,因为你的模式是绝对路径模式,所以返回的文件不会是相对的,而是绝对的,包括整个路径。

当不使用绝对路径模式时,在某些情况下,如果当前工作目录中的文件名匹配,您可能只得到一个文件名。该文件名当然是相对于当前工作目录的。

在 Python 3.10 中,您应该能够通过新的 root_dir 参数在不使用绝对模式的情况下更改假定的根目录,但目前在 3.9 及以下版本中不可用:https://docs.python.org/3.10/library/glob.html

在您的情况下,正如其他人在评论中提到的,os.path.basename 应该能够获得文件名,如果这是您所追求的。或者,您可以通过 os.chdir 更改当前工作目录并提供简单的 *.jpg glob 模式并仅获取与当前工作目录相关的文件名,这两种方法都是合理的解决方案。

提取基本名称:

mydir = r"C:\Users\viodo\PycharmProjects\pythonProject"
file_list = [os.path.basename(f) for f in glob.glob(mydir + "/*.jpg")]

或返回与任意“当前工作目录”相关的文件:

os.chdir(r"C:\Users\viodo\PycharmProjects\pythonProject")
file_list = glob.glob("*.jpg")

根据您的要求,一种解决方案可能比另一种更好。