python - 使用 glob 扫描文件路径

标签 python glob

我正在使用 glob 搜索位于子文件夹中的所有 .csv,如下所示:

def scan_for_files(path):
    file_list = []
    for path, dirs, files in os.walk(path):
        for d in dirs:
            for f in glob.iglob(os.path.join(path, d, '*.csv')):
                file_list.append(f)
    return file_list

如果我调用:

path = r'/data/realtimedata/trades/bitfinex/' 扫描文件(路径)

我得到了正确的文件递归列表:

['/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_12.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_13.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_15.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_11.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_09.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_10.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_08.csv',
 '/data/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_2018_05_14.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_14.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_12.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_10.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_08.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_09.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_15.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_11.csv',
 '/data/realtimedata/trades/bitfinex/ethusd/bitfinex_ethusd_trades_2018_05_13.csv']

然而,当使用包含我想要的文件的实际子目录时 - 它返回一个空列表。知道为什么会这样吗?谢谢。

path = r'/data/realtimedata/trades/bitfinex/btcusd/' 扫描文件(路径) 返回:[]

最佳答案

看起来 btcusd 是一个底层目录。这意味着当您使用 r'/data/realtimedata/trades/bitfinex/btcusd/' 路径调用 os.walk 时,dirs变量将是一个空列表 [],因此内部循环 for d in dirs: 根本不会执行。

我的建议是重写您的函数以直接遍历文件,而不是目录...别担心,您最终会到达那里,这就是目录的本质.

def scan_for_files(path):
    file_list = []
    for path, _, files in os.walk(path):
        for f in files:
            file_list.extend(glob.iglob(os.path.join(path, f, '*.csv'))

    return file_list

但是,在较新版本的 python (3.5+) 上,您可以使用递归 glob:

def scan_for_files(path):
    return glob.glob(os.path.join(path, '**', '*.csv'), recursive=True)

Source .

关于python - 使用 glob 扫描文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50343406/

相关文章:

python - 删除内容后如何设置 tkinter 条目验证

python - 统一码编码错误 : 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

python - 使用 gevent.queue.Queue.get() : gevent. hub.LoopExit: 'This operation would block forever'

python - 将日期时间转换回 Windows 64 位 FILETIME

python - 从 python 的 glob 中提取所有扩展

python - Glob 在 Python 中返回一个空列表

linux - 如何在 Bash 中使用 '*' 通配符检查参数是否相等?

Python 模块 BeautifulSoup 提取 anchor href

python - 我们如何从所有子目录中读取所有json文件?

javascript - 使用 `**` 但忽略与指定名称匹配的目录