Python:创建词典

2024-06-24 13:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

#---------------------------------------------------------
#  Print days diff by Converting Unix timestamp to Readable Date/time
#---------------------------------------------------------
def convUnixTime(t):
        return 1+(datetime.datetime.fromtimestamp(t*60*60*24)
              - datetime.datetime.today()).days


#---------------------------------------------------------
# Read shadow file and check for account expires and create dictionary 
#---------------------------------------------------------
with open( "/etc/shadow" ) as shadow:
        for aLine in shadow:
                filed = aLine.split(":")
                f = filed[7]
                try:
                    f = int(f)
                    f=convUnixTime(f)
                except ValueError:
                    f = "NULL"
                if f != "NULL" and f <= 0:
                        total_expired_users += 1
                        expr_list[ filed[0] ] = f
                elif f != "NULL" and f <= min_days:
                        total_expring_users += 1
                        expr_list[ filed[0] ] = f

我已经创建了用户的字典,其中帐户已经过期,但我认为这已经做了更干净和简单的方式。。在

提前谢谢!!在


Tags: andfordatetimediffdaysnulluserslist
3条回答

使用try-except子句,这可能看起来更干净:

try:
    f = int(f)
    f=convUnixTime(f)
except ValueError:
    pass
else:
    if f <= 0:
      total_expired_users += 1
      expr_list[ filed[0] ] = f
    elif f <= min_days:
      total_expring_users += 1
      expr_list[ filed[0] ] = f

您也可以稍微更改顺序,以避免expr_list[filed[0]]重复:

^{pr2}$

谢谢贝雷尔

在你的纠正下,我已经创造了最终的。。在

#                            -
#  Convert Unix timestamp to Readable Date/time
#                            -
def convUnixTime(t):
        return datetime.datetime.fromtimestamp(t*60*60*24)


#                            -
# Read shadow file and check for account expriry
#                            -
with open( "/etc/shadow" ) as shadow:
        for aLine in shadow:
                filed = aLine.split(":")
                f = filed[7]
                try:
                        f = int(f)
                        exprdate = convUnixTime(f)
                        f=1+( exprdate - datetime.datetime.today()).days
                        l=[f,exprdate]
                except ValueError:
                        pass
                else:
                        if f <= min_days:
                                expr_list[filed[0]]=l
                        if f <= 0:
                                total_expired_users += 1
                        else:
                                total_expring_users += 1

分析完整个Script。。 输出:

^{pr2}$

您可以使用列表理解来简化代码:

import datetime

min_days = 20000

def conv_unix_time(t):
    return (1+(datetime.datetime.fromtimestamp(int(t)*60*60*24)
            - datetime.datetime.today()).days) if t else None

with open('foo.txt') as shadow:
    expire_durations = {line.split(':')[0]: conv_unix_time(line.split(':')[7]) for line in shadow}

print [user for user, time in expire_durations.iteritems() if time and time < 0]
print [user for user, time in expire_durations.iteritems() if time and 0 < time < min_days]

相关问题 更多 >