python查找模式后面的文件夹中的所有文件名

时间:2016-02-19 03:22:16

标签: python

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

'index_20091101.csv', 'index_20091102.csv', 'index_20091103.csv', 'index_20091104.csv', 'index_20091105.csv', 'index_20091106.csv', 'index_20091107.csv', 'index_20091108.csv',

给定startDate和endDate,我想找到所有文件名,日期部分位于startDate和endDate之间。例如,对于上面的文件列表,如果startDate = 20091104和endDate = 20091107,我想要找到的文件名应为:

'index_20091104.csv', 'index_20091105.csv', 'index_20091106.csv', 'index_20091107.csv'

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

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

4 个答案:

答案 0 :(得分:3)

import glob
glob.glob('index_[0-9]*.csv')

这将计算以数字开头的文件名。

John's解决方案完全匹配8个数字。

答案 1 :(得分:2)

如果您想与glob完全匹配8位数,则需要将它们全部写出来

import glob
glob.glob('index_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv')
  

帮助模块glob中的函数glob:

     

<强>水珠(路径)       返回与路径名模式匹配的路径列表。

     

模式可能包含简单的shell样式通配符a la      的fnmatch。但是,与fnmatch不同,文件名以a开头      dot是与'*'和'?'不匹配的特殊情况      图案。

如果你想要真正的正则表达式,请使用os.listdir并过滤结果

[x for x in os.listdir('.') if re.match('index_[0-9]*.csv', x)]

答案 2 :(得分:1)

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

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

现在,您只需创建一个谓词来过滤掉您想要的日期范围

time_filt = make_time_filter('20091101', '20091201', '%Y%m%d')

然后将其传递给filter

filter(time_filt, os.listdir(your_dir))

或者理解某种

(fname for fname in os.listdir(your_dir) if time_filt(fname))

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

答案 3 :(得分:0)

这将使您获得您想要的位置,并允许您提供开始和结束日期:

GetListOfUsers();