最近在學習語音的知識,看一個語音合成實現的相關工具包的源代碼,碰到了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!