如何以这样的方式列出01
到12
的数字(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月 干杯!!
答案 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()
方法...
希望这就是你要找的......