[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!

 

posted @ 2019-05-01 11:40  萌新的学习之路  阅读(2923)  评论(0编辑  收藏  举报