2011-02-14 4 views
3

01 ~ 12 (12 개월마다 하나씩)을 나열하면 어떻게 될까요? 현재 달은 항상 가장 오래된 것이있는 곳에서 마지막으로 오게됩니다. 먼저. 즉, 그 숫자가 현재 달보다 크다면, 그것은 전년도의 것입니다.월 및 연도 산술에 기초한 파일 이름 목록 생성

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] 

, 나는이 얻을 :

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

:

[[email protected] 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 

내가 원래 게시물에 말했듯이, 나는 결과가 대신 순서로 좋아 원본 디렉토리의 파일은 다음과 같습니다.

[[email protected] 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 

더 나은 사진을 제공 했습니까? 처음부터 매우 명확하지 않은 것에 대해 유감스럽게 생각합니다. 건배!! 내가 전에 말했듯이, 나는이 순서대로 인쇄 B에 결과를 찾고 있어요

[[email protected] 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 월 -> 2010 년 12 월 -> 1 월, 2011 -> 2 월, 2012 건배 !!

+0

파일 이름이 월 단위로 명명 된 것 같습니다. – KyleWpppd

+2

설명에 따라 필요한 출력이 [09, 03, 01, 02]가 아닌 [03, 09, 01, 02]이 될 수 있습니까? – rajeshnair

+0

@geekGod : 맞아요. [03, 09, 01, 02]이어야합니다. 그건 내 실수 였어. – MacUsers

답변

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)] 
    ... 
+0

도움을 주셔서 감사합니다. 거의 내가 찾던 것이 아니었지만 정확하지는 않았습니다. 원본 게시물을 결과로 업데이트했습니다. 건배!! – MacUsers

+0

@MacUsers : 간단한 실수. 숫자가 아닌 알파벳순으로 정렬됩니다. 지금 내 대답을 편집 중입니다. –

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에 대해 동일하고, 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인치 Jan = 1을 원하면 결과 숫자에 1을 더할 수 있습니다 (즉, [m % 12 + 1 for ... if m % 12 + 1 in themonths]). 하지만 적어도 백엔드의 경우에는 Jan = 0이 더 나은 시스템이라고 생각합니다.

+0

@ senderle : 내 생각에, 당신의 방법 1 및/또는 3이 나를 위해 가장 적합하다고 생각합니다. 그러나, 나는 당신이 실제로하고 싶은 것을 더 잘 이해할 수 있도록 원본을 업데이트했습니다. 건배!! – MacUsers

+0

@senderle : 불행한 점은'TypeError : sort()는 키워드 인수를 사용하지 않습니다 .' 오류입니다. 나는 v2.3에있다 - 문제인가? 다른 이유로,이 특정 상자의 v2.3을 고수해야합니다. 그렇지 않으면 여러 가지 문제가 발생합니다. – MacUsers

+0

와우, 나는'key' 키워드가 2.3보다 새로운 것을 깨닫지 못했습니다. 2.3 설치 테스트를 설치하는 데 필요한 자금이 없기 때문에 새 솔루션 (1 대신 3을 기반으로 함)이 작동하지 않는다면 알려주십시오. – senderle

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] 

을 이제 앞에 0을 가지고 그 목록이 필요하고, 개별 요소가있을 경우 문자열 :

>>> 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() 방법에서 ...당신이 ...

+0

아마도 월 산술 연산을위한리스트가 아닌 모듈로를 사용하는 것이 더 좋을 것입니다. – dawg

+0

원본 게시물을 업데이트했습니다. – MacUsers

관련 문제