[python]glob模块中的glob()函数为什么返回空列表??
最近在学习语音的知识,看一个语音合成实现的相关工具包的源代码,碰到了glob()函数。然后开启了我与这个函数相爱想杀的一个下午。
摘自官网解释:
https://docs.python.org/2/library/glob.html#module-glob
简而言之,这个函数的作用呢就是按照unix shell的规则匹配一定模式的路径名,返回一个无序的列表。
我的代码使用:
from os.path import join from glob import glob import numpy as np DATA_ROOT = "~/文档/nnmnkwii/nnmnkwii_gallery-master/data/slt_arctic_full_data" files = sorted(glob(join(DATA_ROOT, "merlin_baseline_practice", "duration_data", "label_state_align", "*.lab"))) print("{} \n".format(files)) for file in files: print("{} \n".format(file))
我是要用这个代码匹配对应文件夹下的.lab文件,但是明明文件夹下有数据,但是返回的就是个空列表。
关键问题是不要使用相对路径,要使用绝对路径,
上面官网解释也说了,对于~和shell变量使用os.path.expanduser()和os.path.expandvars()扩展。
for tilde and shell variable expansion, use os.path.expanduser() and os.path.expandvars().
将DATA_ROOT中的”~“改成”/home/tangli“就ok了。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ok,不重要的其他碎碎念,如果过程这么简单就好了,但是毕竟是耗费了我一个下午的时间与精力的故事。
源码中有个.py文件也用到了这个函数,和我上面的代码几乎没有差别,也用的相对路径。
但是该源代码运行良好,毫无问题,所以是命运暗中出了差错吗?
后来经过大佬相助,可能命运对我施以援手,看不得我被bug折磨的痛苦不堪吧,毕竟五一劳动节我还在辛勤劳动调bug。
后来发现,该源代码中有这样几行代码:
from docopt import docopt if __name__ == "__main__": args = docopt(__doc__) DATA_ROOT = args["<DATA_ROOT>"] DST_ROOT = DATA_ROOT max_num_files = int(args["--max_num_files"]) overwrite = args["--overwrite"] use_phone_alignment = args["--use_phone_alignment"] question_path = args["--question_path"] print(DATA_ROOT)
问题就在第一行,这个神奇的模块的作用,将我传递的DATA_ROOT参数的相对路径改成了绝对路径。
若诸君感兴趣,就去研究源代码吧,奉上链接:
https://github.com/docopt/docopt
done!