Python使用glob模块匹配quotes目录下txt文件返回空列表的解决方法
glob调用返回空列表的常见成因与排查解决方法
核心常见成因(按出现概率从高到低排序)
匹配规则的转义逻辑完全错误(你当前代码最可能的问题)
你代码里写的匹配字符串是glob.glob("quotes\*txt"),这里存在两层转义冲突:- Python普通字符串层面:反斜杠
\是转义起始符,没有使用原始字符串或双反斜杠的情况下,拼接出的字符串内容和你预期的路径分隔符逻辑不符 - glob本身的匹配规则层面:如果规则里出现
\*,glob会把反斜杠后的*识别为需要匹配的普通字面星号字符,而不是可以匹配任意文件名的通配符——相当于你在寻找「quotes目录下,文件名带一个号、后缀为txt的特殊文件」,常规的文本文件根本不会带号,自然返回空列表。
对应修正方式:
- 用正斜杠作为路径分隔符(跨平台兼容,Windows也支持):
glob.glob("quotes/*.txt") - 用原始字符串避免Python层转义:
glob.glob(r"quotes\*txt") - 用双反斜杠转义路径分隔符:
glob.glob("quotes\\*txt")
- Python普通字符串层面:反斜杠
相对路径的解析基准和预期不符
glob的相对路径是基于当前Python进程的工作目录解析的,不是基于代码文件本身的所在目录。很多场景下(比如IDE启动路径不对、打包成exe运行、在上级目录运行脚本),进程的工作目录和你预期的「包含quotes文件夹的目录」不一致,就会导致glob找不到目标路径返回空。
排查方式:在调用glob之前打印os.getcwd(),确认当前进程的工作目录下,是否真的存在quotes文件夹。
解决方式:放弃依赖相对路径,用Path(__file__).parent拿到当前代码文件的所在目录,拼接出quotes文件夹的绝对路径再传给glob,从根源上避免工作目录变动的影响,示例:glob.glob(Path(__file__).parent / "quotes" / "*.txt")路径/文件本身的细节错误
- 目录名拼写错误:比如把
quotes拼成quote、大小写不匹配(在Linux/macOS这类大小写敏感的文件系统上,Quotes和quotes是两个完全不同的目录) - 文件后缀实际不匹配:比如Windows默认隐藏已知文件扩展名,你看着是
happy.txt,实际文件真实名是happy.txt.txt、happy.md,和你写的*.txt匹配规则对不上 - 目录层级不匹配:如果txt文件存在quotes的下级子文件夹里,一层路径的glob是匹配不到的,需要开启递归匹配,用
glob.glob("quotes/**/*.txt", recursive=True)才能遍历所有子目录
- 目录名拼写错误:比如把
文件系统权限问题
如果当前运行Python的用户对quotes目录没有读取权限,部分系统下glob会直接跳过无权限的目录,返回空列表,不会抛出报错,很容易被忽略。
修正后的可参考代码实现
from pathlib import Path import glob import random import os # 基于代码文件位置拼接绝对路径,完全规避工作目录问题 QUOTE_DIR = Path(__file__).resolve().parent / "quotes" def get_quote(self, feel): feel = feel.lower() # 做大小写兼容的txt文件匹配,避免文件系统大小写敏感导致的匹配失败 available_quote_files = glob.glob(str(QUOTE_DIR / "*.[tT][xX][tT]")) print(available_quote_files) available_feelings = [Path(file_path).stem for file_path in available_quote_files] if feel in available_feelings: target_file = QUOTE_DIR / f"{feel}.txt" with open(target_file, encoding="utf-8") as f: quotes = f.readlines() self.ids.quote.text = random.choice(quotes) else: self.ids.quote.text = "try another feeling"
内容的提问来源于stack exchange,提问作者shradha gupta
相关产品推荐
相关产品推荐

