2

我有几个名为yyyymmdd-hhmmss.csv.gz. 现在我想从凌晨 2 点开始打开每天的第一个文件,一个一个地做一些处理。

我的文件是:

...
20120706-015923.txt
20120706-015934.txt 
20120706-020008.txt
20120706-020030.txt
...
20120707-015934.txt
20120707-020005.txt
20120707-020015.txt
...

所以我想先查看这个文件夹中的文件名,找出20120706-020008.txt当天凌晨 2 点开始的第一个文件,然后我有一个脚本来读取所有行并进行一些处理。我的问题是,如何告诉这个脚本找到这些文件? 20120706-020008.txt, 20120707-020015.txt, 20120708-02....

4

3 回答 3

3

您可以使用该glob模块来遍历文件:

import glob
for f in glob.glob('20120707-*'):
    # do something with f

上面的代码意思是:遍历所有文件名以.开头的文件20120707-。该*符号与文件名的其余部分匹配。

您可以使用该datetime模块在 Python 代码中计算文件的前缀(请参阅文档以了解您可以使用哪些值strftime):

import datetime
today = datetime.date.today()
print today.strftime("%Y%m%d")

结合代码变为:

import datetime    
import glob

today = datetime.date.today()
pattern = "{0}-*".format(today.strftime("%Y%m%d"))
for f in glob.glob(pattern):
    # do something with f

您还可以通过在搜索模式中包含文件来强制glob只查找.txt文件:

pattern = "{0}-*.txt".format(today.strftime("%Y%m%d"))
于 2012-07-10T11:52:28.023 回答
3

for loop和的一些简单用法dictionary

import glob
import datetime

dic={}

for f in glob.glob('*-*.txt'):
    d = datetime.datetime.strptime(f, '%Y%m%d-%H%M%S.txt')
    if d.hour < 2:
        continue
    if not d.day in dic or dic[d.day][0] > d.time:
        dic[d.day] = (d.time, f)

for t, f in dic.values():
    print f

给定以下文件:

20120706-015923.txt
20120706-015934.txt 
20120706-020008.txt
20120706-020030.txt
20120707-015934.txt
20120707-020005.txt
20120707-020015.txt

输出将是:

20120706-020008.txt
20120707-020005.txt
于 2012-07-10T12:07:15.203 回答
0

您希望将文件按时间顺序分组到凌晨 2 点到凌晨 2 点之间的时间,对它们进行排序并取第一个:

import itertools as it
import glob
import datetime

def map_to_day_2am(fn):
    # parses filename, substracts two hours and returns the date
    return (datetime.strptime(fn, '%Y%m%d-%H%M%S.txt') -
            datetime.timedelta(hours=2)).date()

for day, daily_fns_iter in it.groupby(sorted(glob.glob('*.txt')),
                                      key=map_to_day_2am):
    print min(daily_fns_iter)
于 2012-07-10T12:20:07.973 回答