使用glob扫描CSV文件时指定子目录返回空列表问题
问题分析与解决
嘿,我一眼就瞅出你这个函数的问题所在啦!
为什么传入btcusd/路径会返回空列表?
你的scan_for_files函数逻辑有个小漏洞:
当你传入/data/realtimedata/trades/bitfinex/btcusd/时,os.walk(path)遍历的第一层里,dirs是这个目录下的子目录列表。如果btcusd/下面没有再嵌套子目录(.csv文件直接存在这个目录里),那dirs就是个空列表,中间的for d in dirs循环根本不会执行,自然找不到任何文件。
而当你传入/data/realtimedata/trades/bitfinex/时,dirs里包含btcusd这些子目录,所以循环能正常进入,进而找到子目录里的.csv文件。
另外,你的代码还有个冗余逻辑:os.walk本身就会遍历所有层级的目录,你手动嵌套循环处理dirs的操作,反而漏掉了当前目录下直接存放的文件。
两种可行的修复方案
方案一:简化os.walk的用法
直接遍历os.walk返回的所有文件,筛选出.csv后缀的即可:
import os def scan_for_files(path): file_list = [] # os.walk返回(root, dirs, files),我们不需要dirs可以用_占位 for root, _, files in os.walk(path): for file in files: if file.endswith('.csv'): file_list.append(os.path.join(root, file)) return file_list
方案二:用glob递归匹配(更简洁)
如果坚持想用glob,可以直接开启递归匹配模式,一行代码搞定:
import glob import os def scan_for_files(path): # **匹配所有子目录,recursive=True开启递归扫描 return glob.glob(os.path.join(path, '**', '*.csv'), recursive=True)
这两种方式都能完美处理两种路径场景,不管目标目录下有没有子目录,都能把所有.csv文件找出来~
内容的提问来源于stack exchange,提问作者swifty
相关产品推荐
相关产品推荐

