python 查找文件夹中遵循模式的所有文件名

con*_*001 2 python

我试图在遵循以下模式的文件夹中查找所有文件名:'index_YYYYMMDD.csv'。'YYYYMMDD' 部分表示数据文件的日期。下面列出了一些文件名:

'index_20091101.csv', 'index_20091102.csv', 'index_20091103.csv', 'index_20091104.csv', 'index_20091105.csv', 'index_20091106.csv1',index_20102.csv', 'index_2070102.csv', 'index_20091104.csv'

给定 startDate 和 endDate,我想找到所有文件名,其中的日期部分在 startDate 和 endDate 之间。比如上面的文件列表,如果startDate=20091104和endDate=20091107,我想查找的文件名应该是:

'index_20091104.csv'、'index_20091105.csv'、'index_20091106.csv'、'index_20091107.csv'

我试过 os.listdir 函数,它给了我所有的文件名。为了过滤掉不需要的文件,我想我需要使用正则表达式,但无法解决。

任何人都可以帮助我吗?谢谢!

KID*_*ney 9

import glob
glob.glob('index_[0-9]*.csv')
Run Code Online (Sandbox Code Playgroud)

这将对以数字开头的文件名进行数学运算。

John 的解决方案正好匹配 8 个数字。


Jam*_*ore 3

我会采取以下方法。您可以定义一个简单的文件过滤器工厂。

import time

def make_time_filter(start, end, time_format, file_format='index_{time_format:}.csv'):
    t_start = time.strptime(start, time_format)
    t_end = time.strptime(end, time_format)
    ft_fmt = file_format.format(time_format=time_format)

    def filt(fname):
        try:
            return t_start <= time.strptime(fname, ft_fmt) <= t_end
        except ValueError:
            return False

    return filt
Run Code Online (Sandbox Code Playgroud)

现在,您可以简单地创建一个谓词来过滤出您想要的日期范围

time_filt = make_time_filter('20091101', '20091201', '%Y%m%d')
Run Code Online (Sandbox Code Playgroud)

然后将其传递给filter

filter(time_filt, os.listdir(your_dir))
Run Code Online (Sandbox Code Playgroud)

或者将其理解为某种形式

(fname for fname in os.listdir(your_dir) if time_filt(fname))
Run Code Online (Sandbox Code Playgroud)

正则表达式会更通用,但在您的情况下不需要正则表达式,因为您的文件名都遵循一种简单的模式,您知道该模式必须包含日期。有关该time模块的更多信息,请参阅文档