根据月和年算术生成文件名列表

时间:2011-02-14 04:19:32

标签: python

如何以这样的方式列出0112的数字(12个月中的每一个),以便当前月份始终位于最旧的月份之前。换句话说,如果数字比当前月份更大,那么它就是去年的数字。

e.g。 02是2011年2月(现在是当月),03是2010年3月,09是2010年9月,但01是2011年1月。在这种情况下,我想[09, 03, 01, 02]。这就是我要确定的一年:

for inFile in os.listdir('.'):
    if inFile.isdigit():
    month = months[int(inFile)]
       if int(inFile) <= int(strftime("%m")):
           year = strftime("%Y")
       else:
           year = int(strftime("%Y"))-1
       mnYear = month + ", " + str(year)

我不知道下一步该做什么。我该怎么办?

<小时/>的更新

我认为,我最好上传整个脚本以便更好地理解。

#!/usr/bin/env python

import os, sys
from time import strftime
from calendar import month_abbr

vGroup = {}
vo = "group_lhcb"
SI00_fig = float(2.478)
months = tuple(month_abbr)

print "\n%-12s\t%10s\t%8s\t%10s" % ('VOs','CPU-time','CPU-time','kSI2K-hrs')
print "%-12s\t%10s\t%8s\t%10s" % ('','(in Sec)','(in Hrs)','(*2.478)')
print "=" * 58

for inFile in os.listdir('.'):
    if inFile.isdigit():
        readFile = open(inFile, 'r')
        lines = readFile.readlines()
        readFile.close()

        month = months[int(inFile)]
        if int(inFile) <= int(strftime("%m")):
            year = strftime("%Y")
        else:
            year = int(strftime("%Y"))-1
        mnYear = month + ", " + str(year)

        for line in lines[2:]:
            if line.find(vo)==0:
                g, i = line.split()
                s = vGroup.get(g, 0)
                vGroup[g] = s + int(i)

        sumHrs = ((vGroup[g]/60)/60)
        sumSi2k = sumHrs*SI00_fig
        print "%-12s\t%10s\t%8s\t%10.2f" % (mnYear,vGroup[g],sumHrs,sumSi2k)
        del vGroup[g]

当我运行脚本时,我得到了这个:

[root@serv07 usage]# ./test.py 

VOs               CPU-time  CPU-time     kSI2K-hrs
                  (in Sec)  (in Hrs)      (*2.478)
==================================================
Jan, 2011        211201372     58667     145376.83
Dec, 2010          5064337      1406       3484.07
Feb, 2011         17506049      4862      12048.04
Sep, 2010        210874275     58576     145151.33

正如我在原帖中所说,我喜欢结果是这个顺序:

Sep, 2010        210874275     58576     145151.33
Dec, 2010          5064337      1406       3484.07
Jan, 2011        211201372     58667     145376.83
Feb, 2011         17506049      4862      12048.04

源目录中的文件如下所示:

[root@serv07 usage]# ls -l
total 3632
-rw-r--r--  1 root root 1144972 Feb  9 19:23 01
-rw-r--r--  1 root root  556630 Feb 13 09:11 02
-rw-r--r--  1 root root  443782 Feb 11 17:23 02.bak
-rw-r--r--  1 root root 1144556 Feb 14 09:30 09
-rw-r--r--  1 root root  370822 Feb  9 19:24 12

我现在有更好的照片吗?对不起,首先不是很清楚。干杯!!

<小时/> 更新@Mark Ransom

这是Mark建议的结果:

[root@serv07 usage]# ./test.py 

VOs               CPU-time  CPU-time     kSI2K-hrs
                  (in Sec)  (in Hrs)      (*2.478)
==========================================================
Dec, 2010          5064337      1406       3484.07
Sep, 2010        210874275     58576     145151.33
Feb, 2011         17506049      4862      12048.04
Jan, 2011        211201372     58667     145376.83

正如我之前所说,我正在寻找按此顺序打印的结果: 2010年9月 - &gt; 2010年12月 - &gt; 2011年1月 - &gt; 2011年2月 干杯!!

3 个答案:

答案 0 :(得分:1)

第三次更新:

import os, sys
from time import strftime
from calendar import month_abbr

thismonth = int(strftime("%m"))
sortedmonths = ["%02d" % (m % 12 + 1) for m in range(thismonth, thismonth + 12)]
inFiles = [m for m in sortedmonths if m in os.listdir('.')]

for inFile in inFiles:
    readFile = open(inFile, 'r')
    # [ ... everything else is the same from here (but reindented)... ]

列表理解是可取的,但如果我所做的事情在2.3中不是犹太人,那试试这个:

inFiles = filter(lambda x: x.isdigit(), os.listdir('.'))
sortedmonths = map(lambda x: "%02d" % (x % 12 + 1), range(thismonth, thismonth + 12))
inFiles = filter(lambda x: x in inFiles, sortedmonths)

第二次更新:

好的,根据您的编辑,我认为这是最简单的解决方案:

import os, sys
from time import strftime
from calendar import month_abbr

thismonth = int(strftime("%m"))
inFiles = []
for inFile in os.listdir('.'):
    if inFile.isdigit():
        inFiles.append(inFile)
inFiles.sort(key=lambda x: (int(x) - thismonth - 1) % 12)

for inFile in inFiles:
    readFile = open(inFile, 'r')
    # [ ... everything else is the same from here (but reindented)... ]

这样你的主循环就会以正确的顺序遍历文件。

你也可以用一行理解来替换上面的四行循环:

inFiles = [inFile for inFile in os.listdir('.') if inFile.isdigit()]

另外,我建议使用from datetime import datetime,然后datetime.now()。它的界面比strftime()更好 - datetime.now().month返回一个数字月(.year.min.second等相同,{{1}提供格式正确的日期时间字符串。

<强>更新

好的,经过一些更多的摆弄,这是我认为最有效的方法 - 无论是str(datetime.now())还是Jan = 1,这都有效:

Jan = 0

原帖:

如果我理解正确的话:

>>> themonths = [1, 2, 3, 9]
>>> themonths.sort(key=lambda x: (x - thismonth - 1) % 12)
>>> themonths
[2, 3, 9, 1]

或者,如果你只想要几个月,你可以这样做:

>>> thismonth = 1
>>> [m % 12 for m in range(thismonth + 1, thismonth + 13)]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1]

请注意,在此方案中>>> thismonth = 1 >>> themonths = [0, 1, 2, 8] >>> [m % 12 for m in range(thismonth + 1, thismonth + 13) if m % 12 in themonths] [2, 8, 0, 1] 。如果您需要Jan = 0 .... Dec = 11,只需在结果数字中加1(即Jan = 1)。但我认为[m % 12 + 1 for ... if m % 12 + 1 in themonths]是一个更好的系统,至少对于后端而言。

答案 1 :(得分:1)

除非您对列表进行排序,否则无法打印已排序的列表!我认为修改代码的最简单方法是首先获取文件名,对它们进行排序,然后对排序列表进行操作。通过按照该顺序将列表构建为具有年份和月份的元组,排序将自动为您提供正确的顺序。

filelist = []
for inFile in os.listdir('.'):
    if inFile.isdigit():
        if int(inFile) <= int(strftime("%m")):
            year = strftime("%Y")
        else:
            year = int(strftime("%Y"))-1
        filelist.append((year, inFile))
filelist.sort()
for year, inFile in filelist:
    month = months[int(inFile)]
    ...

答案 2 :(得分:0)

你的问题很难理解。

如果你只想轮换月份的12位数,那么当前月份的数字是最后一位,这就是:

>>> def rot_list(l,n):
...    return l[n:]+l[:n]
... 
>>> rot_list(range(1,13),2)
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2]

如果您要查找的是目标列表(在您的示例中),最终排序和轮换,以便最接近当前月份(由n表示)的那个在最后,这样做:

>>> tar=[1,2,3,9]
>>> n=2
>>> [x for x in range(1,13)[n:]+range(1,13)[:n] if x in tar]
[3, 9, 1, 2]
>>> tar=[3,1,2,9]
>>> [x for x in range(1,13)[n:]+range(1,13)[:n] if x in tar]
[3, 9, 1, 2]

现在,如果您需要该列表具有前导零并且各个元素是字符串:

>>> nm=[3,9,1,2]
>>> fn=['%02i' % x for x in nm]
>>> fn
['03', '09', '01', '02']

无论Jan为'0'还是'1',所有这些方法都有效。只需将range(1,13)的任何引用更改为range(0,12),具体取决于约定。

修改

如果我理解你在做什么,这段代码将有所帮助:

import datetime

def prev_month(year,month,day):
    l=range(1,13)
    l=l[month:]+l[:month]
    p_month=l[10]
    if p_month>month:
        p_year=year-1
    else:
        p_year=year
    return (p_year,p_month,1)

def next_month(year,month,day):
    l=range(1,13)
    l=l[month:]+l[:month]
    p_month=l[0]
    if p_month<month:
        p_year=year+1
    else:
        p_year=year
    return (p_year,p_month,1)

year=2011
month=2
t=(year-1,month,1)
ds=[]
for i in range(1,13):
    print datetime.date(*t).strftime('%m, %y')
    t=next_month(*t)

输出:

02, 10
03, 10
04, 10
05, 10
06, 10
07, 10
08, 10
09, 10
10, 10
11, 10
12, 10
01, 11

只需将适用的文件名格式放在strftime()方法...

希望这就是你要找的......