如何在Python脚本中传递日期?

7 投票
4 回答
34104 浏览
提问于 2025-04-17 06:40

我有一个脚本,用来删除比某个日期更早的图片。

我能在运行这个脚本的时候,把这个日期作为参数传进去吗?

举个例子:这个脚本 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 

4 个回答

2

命令行选项可以通过一个叫 sys.argv 的列表来获取。所以你可以简单地使用

xDate = sys.argv[1]

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

3

对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)
19

一种快速但简单的方法是使用 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)

附言:无论你选择使用哪种方法(sys.argv 或 argparse),把

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

放在 for-loop 外面是个好主意。因为 xDate 的值是不会改变的,你只需要计算一次 expDate

撰写回答