You need to enable JavaScript to run this app. Python使用glob模块匹配quotes目录下txt文件返回空列表的解决方法
优惠活动
大模型
产品
解决方案
定价
更多

Python使用glob模块匹配quotes目录下txt文件返回空列表的解决方法

glob调用返回空列表的常见成因与排查解决方法

核心常见成因(按出现概率从高到低排序)

  • 匹配规则的转义逻辑完全错误(你当前代码最可能的问题)
    你代码里写的匹配字符串是glob.glob("quotes\*txt"),这里存在两层转义冲突:

    1. Python普通字符串层面:反斜杠\是转义起始符,没有使用原始字符串或双反斜杠的情况下,拼接出的字符串内容和你预期的路径分隔符逻辑不符
    2. glob本身的匹配规则层面:如果规则里出现\*,glob会把反斜杠后的*识别为需要匹配的普通字面星号字符,而不是可以匹配任意文件名的通配符——相当于你在寻找「quotes目录下,文件名带一个号、后缀为txt的特殊文件」,常规的文本文件根本不会带号,自然返回空列表。
      对应修正方式:
    • 用正斜杠作为路径分隔符(跨平台兼容,Windows也支持):glob.glob("quotes/*.txt")
    • 用原始字符串避免Python层转义:glob.glob(r"quotes\*txt")
    • 用双反斜杠转义路径分隔符:glob.glob("quotes\\*txt")
  • 相对路径的解析基准和预期不符
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 09:45:09