【问题标题】:how to open some specific files using python如何使用python打开一些特定的文件
【发布时间】:2012-07-10 11:51:13
【问题描述】:

我有几个名为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....

【问题讨论】:

  • yyyymmdd-hhmmss.csv.gz 与您列出的 .txt 文件有何关联?
  • 您打开的文件中是否始终包含“-02”,或者 2:00 之后的第一个文件也可能在 3:00 或 4:00 之后?
  • 您是否阅读了我上一个问题的回答? stackoverflow.com/a/11399167/748858

标签: python datetime glob


【解决方案1】:

for loopdictionary的一些简单用法:

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

【讨论】:

  • dic.keys() 是多余的,因为默认情况下in 将返回字典中的键。
  • @BigYellowCactus 我不明白你在说什么。检查x in dic 将检查x 是否在BurhanKhalid 所说的键中。使用 .keys 只会在 py2 中创建一个列表,并在您可以执行 d.day in dic 时进行成员资格检查 O(N)
  • 对不起,我的错 :-) 我弄混了一些东西。
【解决方案2】:

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

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

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

您可以使用 datetime 模块在 Python 代码中计算文件的前缀(请参阅 documentation 以了解您可以为 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"))

【讨论】:

    【解决方案3】:

    您希望将文件按时间顺序分组到凌晨 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)
    

    【讨论】:

    • Downvoter -- 这有什么问题?这似乎是他想要的 (+1)。
    • 可能不是最“初学者友好”,也许这就是它被否决的原因(我没有投反对票)。
    • 可能是因为错了?它将列出 2am 之前的文件。
    • @BigYellowCactus - 是的,它会在天列出这些文件。如果发生这种情况,周一凌晨 2 点之后的第一个文件是周二凌晨 1 点,那么它也应该被列出。
    • @eumiro 好的,我认为这是一个定义问题。但这仍然是错误的。给定问题中的输入文件,您的代码将输出20120706-015923.txt20120706-020008.txt20120707-020005.txt。为什么20120706-015923.txt 在此列表中?只有两天(2012/07/06 和 2012/07/07),但是三个文件?
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2018-01-02
    相关资源
    最近更新 更多