【问题标题】:How can I pass a date to a script in Python?如何将日期传递给 Python 中的脚本?
【发布时间】:2012-01-02 03:30:34
【问题描述】:

我有一个用于删除早于某个日期的图像的脚本。

我可以在调用运行脚本时将此日期作为参数传递吗?

示例:此脚本 delete_images.py 删除早于某个日期 (YYYY-MM-DD) 的图像

python delete_images.py 2010-12-31

脚本(使用固定日期(xDate 变量))

import os, glob, time

root = '/home/master/files/' # one specific folder
#root = 'D:\\Vacation\\*'          # or all the subfolders too
# expiration date in the format YYYY-MM-DD

### I have to pass the date from the script ###
xDate = '2010-12-31' 

print '-'*50
for folder in glob.glob(root):
    print folder
    # here .jpg image files, but could be .txt files or whatever
    for image in glob.glob(folder + '/*.jpg'):
        # retrieves the stats for the current jpeg image file
        # the tuple element at index 8 is the last-modified-date
        stats = os.stat(image)
        # put the two dates into matching format    
        lastmodDate = time.localtime(stats[8])
        expDate = time.strptime(xDate, '%Y-%m-%d')
        print image, time.strftime("%m/%d/%y", lastmodDate)
        # check if image-last-modified-date is outdated
        if  expDate > lastmodDate:
            try:
                print 'Removing', image, time.strftime("(older than %m/%d/%y)", expDate)
                os.remove(image)  # commented out for testing
            except OSError:
                print 'Could not remove', image 

【问题讨论】:

    标签: python date parameter-passing


    【解决方案1】:

    快速但粗略的方法是使用sys.argv

    import sys
    xDate = sys.argv[1]
    

    更健壮、可扩展的方法是使用argparse 模块:

    import argparse
    
    parser=argparse.ArgumentParser()
    parser.add_argument('xDate')
    args=parser.parse_args()
    

    然后要访问用户提供的值,您将使用 args.xDate 而不是 xDate

    使用argparse 模块,当用户键入时,您会自动免费获得帮助消息

    delete_images.py -h
    

    如果用户未能提供正确的输入,它还会提供有用的错误消息。

    您还可以轻松地为xDate 设置默认值,将xDate 转换为datetime.date 对象,并且正如他们在电视上所说的,“很多很多!”。


    我稍后会在你使用的脚本中看到

    expDate = time.strptime(xDate, '%Y-%m-%d')
    

    xDate 字符串转换为时间元组。你可以用argparse 来做到这一点,所以args.xDate 自动成为一个时间元组。例如,

    import argparse
    import time
    
    def mkdate(datestr):
        return time.strptime(datestr, '%Y-%m-%d')
    parser=argparse.ArgumentParser()
    parser.add_argument('xDate',type=mkdate)
    args=parser.parse_args()
    print(args.xDate)
    

    当这样运行时:

    % test.py 2000-1-1
    

    产量

    time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)
    

    PS。无论您选择使用哪种方法(sys.argv 或 argparse),拉动都是个好主意

    expDate = time.strptime(xDate, '%Y-%m-%d')
    

    for-loop 之外。由于xDate 的值永远不会改变,因此您只需计算一次expDate

    【讨论】:

      【解决方案2】:

      可以通过列表sys.argv 访问命令行选项。所以你可以简单地使用

      xDate = sys.argv[1]
      

      sys.argv[0] 是当前脚本的名称。)

      【讨论】:

        【解决方案3】:

        您可以为此方法使用运行时参数。请看以下链接:http://www.faqs.org/docs/diveintopython/kgp_commandline.html

        【讨论】:

        • 请包含链接文章中的任何相关信息。
        【解决方案4】:

        对 unutbu 的回答稍加修饰:

        import argparse
        import time
        
        def mkdate(datestr):
          try:
            return time.strptime(datestr, '%Y-%m-%d')
          except ValueError:
            raise argparse.ArgumentTypeError(datestr + ' is not a proper date string')
        
        parser=argparse.ArgumentParser()
        parser.add_argument('xDate',type=mkdate)
        args=parser.parse_args()
        print(args.xDate)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-03
          • 2013-10-24
          • 2010-10-26
          相关资源
          最近更新 更多