Код ниже может помочь вам. Это не особенно интересно и намеренно просто. Это не так, как многие программисты решают эту проблему, но без дополнительной информации, кажется, она отвечает вашим требованиям.
Я также сделал предположение, что вы новичок в Python; Если я не прав, не стесняйтесь игнорировать этот пост.
- Разрешает передачу учетных данных базы данных, выходного каталога и дат (начало и конец) в командной строке.
- Использует подпроцесс вместо os.system. Подпроцесс предоставляет предпочтительные механизмы для вызова внешних исполняемых файлов из python. Этот код использует самые простые из них; call () как и os.system ()
- Использует optparse для обработки аргументов командной строки. Хотя код, безусловно, более длинный и более подробный, вам будет легче вносить дополнения и модификации в обработку arg в будущем. Также довольно ясно, что происходит (и код всегда читается гораздо чаще, чем пишется).
- Настройка командной строки выполняется только тогда, когда скрипт выполняется так, как он находится внутри блока
__main__
. Поскольку «логика» сценария находится в методе main (), вы также можете импортировать его и предоставить объект параметров (и список аргументов) из другого источника.
Если вы можете отменить необходимость вывода каждой даты в отдельном файле, вы можете заставить механизм базы данных вычислить SUM () и сгруппировать их по дате. Вы бы вернули все суммы за один вызов БД, что было бы быстрее и могло бы привести к более простому коду.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import datetime
import os
import subprocess
from optparse import OptionParser
SQL = """SELECT d.Date, SUM(d.CostUsd) FROM Stats d WHERE d.Date = '%s' GROUP BY d.Date"""
def get_stats(options, dateobj):
"""Return statistics for the date of `dateobj`"""
_datestr = dateobj.strftime('%Y-%m-%d')
sql = SQL % _datestr
filepath = os.path.join(options.outdir, 'DateLoop-%s.txt' % _datestr)
return subprocess.call('mysql -h %s -u %s -p -sN -e "%s" db > %s' % (options.dbhost, options.dbuser, sql, filepath), shell=True)
def main(options, args):
""""""
_date = options.startdate
while _date <= options.enddate:
rs = get_stats(options, _date)
_date += datetime.timedelta(days=1)
if __name__ == '__main__':
parser = OptionParser(version="%prog 1.0")
parser.add_option('-s', '--startdate', type='string', dest='startdate',
help='the start date (format: yyyymmdd)')
parser.add_option('-e', '--enddate', type='string', dest='enddate',
help='the end date (format: yyyymmdd)')
parser.add_option('--output', type='string', dest='outdir', default='/home/output/',
help='target directory for output files')
parser.add_option('--dbhost', type='string', dest='dbhost', default='myhost',
help='SQL server address')
parser.add_option('--dbuser', type='string', dest='dbuser', default='dbuser',
help='SQL server user')
options, args = parser.parse_args()
## Process the date args
if not options.startdate:
options.startdate = datetime.datetime.today()
else:
try:
options.startdate = datetime.datetime.strptime('%Y%m%d', options.startdate)
except ValueError:
parser.error("Invalid value for startdate (%s)" % options.startdate)
if not options.enddate:
options.enddate = options.startdate + datetime.timedelta(days=7)
else:
try:
options.enddate = datetime.datetime.strptime('%Y%m%d', options.enddate)
except ValueError:
parser.error("Invalid value for enddate (%s)" % options.enddate)
main(options, args)