Difference between revisions of "Synthesizing SVT Data"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) |
PeterHarding (talk | contribs) |
||
| (9 intermediate revisions by the same user not shown) | |||
| Line 21: | Line 21: | ||
import urllib | import urllib | ||
encoded_data = """ | encoded_data = """ | ||
%3CPromptEngineRuntimeContext%20xmlns%3D%22http%3A%2F%2Fwww.crystaldecisions.com%2Freport%22%20xmlns%3Axsi%3D%22http%3A%2F%2F | |||
www.w3.org%2F2001%2FXMLSchema-instance%22%20xmlns%3Axsd%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%22%20xsi%3Atype%3D%22 | |||
PromptEngineRuntimeContext%22%20version%3D%222%22%3E%3CID%3E{MachineXID}%3C%2FID%3E%3CRenderOption%20xsi%3Atype%3D%22 | |||
BOwner%26gt%3B%26lt%3B%2FOwner%26gt%3B%26lt%3BDefinition%20xsi%3Atype%3D%22Parameter%22%20id%3D%225%22%26gt%3B%26lt%3B", | |||
""" | |||
data = urllib.unquote(encoded_data) | data = urllib.unquote(encoded_data) | ||
| Line 27: | Line 32: | ||
print data | print data | ||
</pre> | </pre> | ||
=Generating Synthetic Credit Card Numbers= | |||
<pre> | |||
#!/usr/bin/env python | |||
# | |||
# | |||
# | |||
#------------------------------------------------------------------------------- | |||
""" | |||
Generate a abitrary collection of pseudo Credit card numbers which | |||
satisfy the validation test | |||
""" | |||
import sys | |||
import random | |||
#------------------------------------------------------------------------------- | |||
prefix = '1234' | |||
max_digits = 16 | |||
max_numbers = 1000 | |||
#------------------------------------------------------------------------------- | |||
def gen(prefix): | |||
no = prefix | |||
l = list(no) | |||
i = len(prefix) | |||
while (i < (max_digits - 1)): | |||
x = random.randint(0, 9) | |||
l.append(str(x)) | |||
# print i, l, x | |||
i += 1 | |||
no = ''.join(l) | |||
chk_digit = encode(no) | |||
delta = 10 - chk_digit | |||
if delta == 10: | |||
delta = 0 | |||
# print chk_digit, delta | |||
l.append(str(delta)) | |||
no = ''.join(l) | |||
return no | |||
#------------------------------------------------------------------------------- | |||
def encode(no): | |||
n = 0 | |||
tot = 0 | |||
for i in range(len(no)): | |||
v = int(no[i]) | |||
if i % 2 == 0: | |||
inc = v * 2 | |||
if v > 4: | |||
n += 1 | |||
else: | |||
inc = v | |||
tot += inc | |||
tot += n | |||
chk = tot % 10 | |||
return chk | |||
#------------------------------------------------------------------------------- | |||
def validate(ccnumber): | |||
cnt = 0 | |||
tot = 0 | |||
for i in range(len(ccnumber)): | |||
val = int(ccnumber[i]) | |||
if i % 2 == 0: | |||
inc = val * 2 | |||
if val > 4: | |||
cnt += 1 | |||
else: | |||
inc = val | |||
tot += inc | |||
tot += cnt | |||
if ((tot % 10) == 0): | |||
return True | |||
else: | |||
return False | |||
#------------------------------------------------------------------------------- | |||
def test(): | |||
for no in nos: | |||
print no | |||
if validate(no): | |||
print "Card number VALID" | |||
else: | |||
print "Card number INVALID" | |||
#------------------------------------------------------------------------------- | |||
def main(): | |||
i = 0 | |||
while i < max_numbers: | |||
cc_no = gen(prefix) | |||
if validate(cc_no): | |||
print cc_no | |||
else: | |||
print "Card number %s - INVALID" % cc_no | |||
cc_no = None | |||
if cc_no: | |||
i += 1 | |||
else: | |||
pass | |||
#------------------------------------------------------------------------------- | |||
if __name__ == "__main__": | |||
main(sys.argv[1:]) | |||
#------------------------------------------------------------------------------- | |||
</pre> | |||
=Generating User Profiles= | |||
This script generated user profiles along with associated (synthetically generated) credit card numbers. | |||
<pre> | |||
#!/usr/bin/env python | |||
# | |||
# $Id:$ | |||
# | |||
#------------------------------------------------------------------------------- | |||
""" | |||
Generate an abitrary collection of pseudo Credit Card numbers which | |||
satisfy the validation test | |||
""" | |||
import sys | |||
import random | |||
import getopt | |||
#------------------------------------------------------------------------------- | |||
prefix = '1234' | |||
max_digits = 16 | |||
max_numbers = 1000 | |||
#------------------------------------------------------------------------------- | |||
cost_centers = [ | |||
["XX100000-X", "XXX DIVISION XX100000"], | |||
["XX100001-X", "XXX DIVISION XX100001"], | |||
... | |||
] | |||
#------------------------------------------------------------------------------- | |||
def gen(prefix): | |||
no = prefix | |||
l = list(no) | |||
i = len(prefix) | |||
while (i < (max_digits - 1)): | |||
x = random.randint(0, 9) | |||
l.append(str(x)) | |||
# print i, l, x | |||
i += 1 | |||
no = ''.join(l) | |||
chk_digit = encode(no) | |||
delta = 10 - chk_digit | |||
if delta == 10: | |||
delta = 0 | |||
# print chk_digit, delta | |||
l.append(str(delta)) | |||
no = ''.join(l) | |||
return no | |||
#------------------------------------------------------------------------------- | |||
def encode(no): | |||
n = 0 | |||
tot = 0 | |||
for i in range(len(no)): | |||
v = int(no[i]) | |||
if i % 2 == 0: | |||
inc = v * 2 | |||
if v > 4: | |||
n += 1 | |||
else: | |||
inc = v | |||
tot += inc | |||
tot += n | |||
chk = tot % 10 | |||
return chk | |||
#------------------------------------------------------------------------------- | |||
def validate(ccnumber): | |||
cnt = 0 | |||
tot = 0 | |||
for i in range(len(ccnumber)): | |||
val = int(ccnumber[i]) | |||
if i % 2 == 0: | |||
inc = val * 2 | |||
if val > 4: | |||
cnt += 1 | |||
else: | |||
inc = val | |||
tot += inc | |||
tot += cnt | |||
if ((tot % 10) == 0): | |||
return True | |||
else: | |||
return False | |||
#------------------------------------------------------------------------------- | |||
def test(): | |||
for no in nos: | |||
print no | |||
if validate(no): | |||
print "Card number VALID" | |||
else: | |||
print "Card number INVALID" | |||
#------------------------------------------------------------------------------- | |||
def gen_user_data(): | |||
out = open('Users.dat','w') | |||
out.write("AGS_Number,FirstName,Username,Password,CostCenter,CreditCardNumber\r\n") | |||
i = 0 | |||
no_centers = len(cost_centers) | |||
while i < max_numbers: | |||
center_idx = random.randint(0, no_centers - 1) | |||
cost_center = cost_centers[center_idx][0] | |||
cc_no = gen(prefix) | |||
if validate(cc_no): | |||
out.write("test_%03d,%03d,test%03d,test%03d,%s,%s\r\n" % \ | |||
(i, i, i, i, cost_center, cc_no)) | |||
else: | |||
print "Card number %s - INVALID" % cc_no | |||
cc_no = None | |||
if cc_no: | |||
i += 1 | |||
else: | |||
pass | |||
#------------------------------------------------------------------------------- | |||
USAGE = """\ | |||
Usage: | |||
$ ./gen_user_data.py [-d] [-v] [-f <filename>] | |||
""" | |||
def usage(): | |||
sys.stderr.write(USAGE) | |||
#------------------------------------------------------------------------------- | |||
def main(argv): | |||
global debug_flg | |||
global verbose_flg | |||
global file | |||
#----- Process command line arguments ---------------------------- | |||
try: | |||
opts, args = getopt.getopt(argv, "df:hv", ["debug", "file=", "help", "verbose"]) | |||
except getopt.GetoptError: | |||
usage() | |||
sys.exit(2) | |||
else: | |||
for opt, arg in opts: | |||
if opt in ("-d", "--debug"): | |||
debug_flg = True | |||
elif opt in ("-h", "--help"): | |||
usage() | |||
sys.exit(0) | |||
elif opt in ("-f", "--file"): | |||
logfile = arg | |||
elif opt in ("-v", "--verbose"): | |||
verbose_flg = True | |||
gen_user_data() | |||
#------------------------------------------------------------------------------- | |||
if __name__ == "__main__": | |||
main(sys.argv[1:]) | |||
#------------------------------------------------------------------------------- | |||
</pre> | |||
=Synthetic Expense Data= | |||
The following was used to generate synthetic credit card usage data for importing into the application via a batch import /upload process. This data was then used by LoadRunner scripts to journal expenses against cost codes for subsequent authorization and further processing. | |||
<pre> | |||
#!/usr/bin/env python | |||
# | |||
#--------------------------------------------------------------------- | |||
import os | |||
import csv | |||
import sys | |||
import getopt | |||
import random | |||
import datetime | |||
#--------------------------------------------------------------------- | |||
debug_flg = False | |||
max_flg = False | |||
random_flg = False | |||
verbose_flg = False | |||
__version__ = '1.0.2' | |||
file = None | |||
no_days = 1 | |||
date = datetime.datetime.today() | |||
dates = ['070729', '070730', '070731'] | |||
xcodes = [ | |||
'xxx', | |||
... | |||
'xxx' | |||
] | |||
#----- Set up credit card transactiuon type list --------------------- | |||
cc_merchants = [] | |||
cc_merchants_in = open("cc_merchants.csv", "rb") | |||
reader = csv.reader(cc_merchants_in) | |||
for row in reader: | |||
cc_merchants.append(row) | |||
cc_merchants_in.close() # Explicitly close the file *NOW* | |||
no_merchants = len(cc_merchants) | |||
#----- Set up credit card numbers in cc_no list ---------------------- | |||
cc_no = [] | |||
cc_in = open("cc_no.txt", "rb") | |||
reader = csv.reader(cc_in) | |||
for row in reader: | |||
cc_no.extend(row) | |||
cc_in.close() # Explicitly close the file *NOW* | |||
#----- Set up the file header and footer ----------------------------- | |||
header = """\ | |||
... | |||
""" | |||
footer = """\ | |||
... | |||
""" | |||
#----- Set up the body of the file ----------------------------------- | |||
max_no_tx = 10 # Number of transactions per CC | |||
cost = 1000 # Cost of the transaction | |||
tx_id = 0 # Number that appears in transaction description | |||
def write_data(date): | |||
global cost, tx_id | |||
file_date = date.strftime("%y%m%d") | |||
expense_date = (date - datetime.timedelta(days=1)).strftime("%y%m%d") | |||
print "Generating expense data for '%s'" % expense_date | |||
out = open(file_date,"w") | |||
out.write(header % (file_date, expense_date)) | |||
for i in range(len(cc_no)): | |||
if random_flg: | |||
no_tx = random.randint(0, max_no_tx) | |||
elif max_flg: | |||
no_tx = 5 | |||
else: | |||
no_tx = 1 | |||
tx_cnt = 0 | |||
total = 0.0 | |||
expense_lines = '' | |||
while tx_cnt < no_tx: | |||
cost = random.weibullvariate(alpha=3.0,beta=1) * 2000.0 | |||
type = cc_merchants[random.randint(0, no_merchants-1)] | |||
expense_lines += "16,699,%.0f,,%s,,%s\n" % (cost, type[0], type[1]) | |||
total += cost | |||
tx_cnt += 1 | |||
tx_id += 1 | |||
cost += 5 | |||
expense_block = "01,%s,,...,%03.0f,%d.../\n" % (cc_no[i], total, tx_cnt) | |||
expense_block += expense_lines | |||
expense_block += "99,...,%d/\n" % (tx_cnt + 2) | |||
out.write(expense_block) | |||
out.write(footer) | |||
out.close() | |||
#------------------------------------------------------------------------------- | |||
USAGE = """\ | |||
Usage: | |||
$ ./gen_user_data.py [-d] [-v] [-f <filename>] | |||
""" | |||
def usage(): | |||
sys.stderr.write(USAGE) | |||
#------------------------------------------------------------------------------- | |||
def main(argv): | |||
global debug_flg | |||
global max_flg | |||
global random_flg | |||
global verbose_flg | |||
global file, date, no_days | |||
#----- Process command line arguments ---------------------------- | |||
try: | |||
opts, args = getopt.getopt(argv, "dD:f:hmn:rv", | |||
["date", "debug", "file=", "help", "max", "no_days", "random", "verbose"]) | |||
except getopt.GetoptError: | |||
usage() | |||
sys.exit(2) | |||
else: | |||
for opt, arg in opts: | |||
if opt in ("-d", "--debug"): | |||
debug_flg = True | |||
elif opt in ("-D", "--date"): | |||
target_date = arg | |||
date = datetime.datetime.strptime(target_date, "%Y%m%d") | |||
print date | |||
elif opt in ("-f", "--file"): | |||
logfile = arg | |||
elif opt in ("-h", "--help"): | |||
usage() | |||
sys.exit(0) | |||
elif opt in ("-m", "--max"): | |||
max_flg = True | |||
elif opt in ("-n", "--no_days"): | |||
no_days = int(arg) | |||
elif opt in ("-r", "--random"): | |||
random_flg = True | |||
elif opt in ("-v", "--verbose"): | |||
verbose_flg = True | |||
dates = [] | |||
for n in range(no_days): | |||
d = date - datetime.timedelta(days=n) | |||
print d.strftime("%y%m%d") | |||
dates.append(d) | |||
# print date.strftime("%y%m%d") | |||
for d in dates: | |||
write_data(d) | |||
#------------------------------------------------------------------------------- | |||
if __name__ == "__main__": | |||
main(sys.argv[1:]) | |||
#------------------------------------------------------------------------------- | |||
</pre> | |||
[[Category:Python]] | |||
=Other Examples= | =Other Examples= | ||
* [[Python - File operations]] | * [[Python - File operations]] | ||
* [[Python - File sorts]] | |||
[[Category:LoadRunner]] | [[Category:LoadRunner]] | ||
[[Category:Python]] | [[Category:Python]] | ||
Latest revision as of 12:10, 2 April 2009
Overview
Preparing data for performance tests is a very important part of the preparation phase for a load test exercise. The following scripts provide simple examples of approaches to synthesize parameter data for use by the test scripts.
User Login IDs
#!/usr/bin/env python print 'UserId' for i in range(200): print "svt%03d" % i
Unquoting URL Data
#!/usr/bin/env python
import urllib
encoded_data = """
%3CPromptEngineRuntimeContext%20xmlns%3D%22http%3A%2F%2Fwww.crystaldecisions.com%2Freport%22%20xmlns%3Axsi%3D%22http%3A%2F%2F
www.w3.org%2F2001%2FXMLSchema-instance%22%20xmlns%3Axsd%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%22%20xsi%3Atype%3D%22
PromptEngineRuntimeContext%22%20version%3D%222%22%3E%3CID%3E{MachineXID}%3C%2FID%3E%3CRenderOption%20xsi%3Atype%3D%22
BOwner%26gt%3B%26lt%3B%2FOwner%26gt%3B%26lt%3BDefinition%20xsi%3Atype%3D%22Parameter%22%20id%3D%225%22%26gt%3B%26lt%3B",
"""
data = urllib.unquote(encoded_data)
print data
Generating Synthetic Credit Card Numbers
#!/usr/bin/env python
#
#
#
#-------------------------------------------------------------------------------
"""
Generate a abitrary collection of pseudo Credit card numbers which
satisfy the validation test
"""
import sys
import random
#-------------------------------------------------------------------------------
prefix = '1234'
max_digits = 16
max_numbers = 1000
#-------------------------------------------------------------------------------
def gen(prefix):
no = prefix
l = list(no)
i = len(prefix)
while (i < (max_digits - 1)):
x = random.randint(0, 9)
l.append(str(x))
# print i, l, x
i += 1
no = ''.join(l)
chk_digit = encode(no)
delta = 10 - chk_digit
if delta == 10:
delta = 0
# print chk_digit, delta
l.append(str(delta))
no = ''.join(l)
return no
#-------------------------------------------------------------------------------
def encode(no):
n = 0
tot = 0
for i in range(len(no)):
v = int(no[i])
if i % 2 == 0:
inc = v * 2
if v > 4:
n += 1
else:
inc = v
tot += inc
tot += n
chk = tot % 10
return chk
#-------------------------------------------------------------------------------
def validate(ccnumber):
cnt = 0
tot = 0
for i in range(len(ccnumber)):
val = int(ccnumber[i])
if i % 2 == 0:
inc = val * 2
if val > 4:
cnt += 1
else:
inc = val
tot += inc
tot += cnt
if ((tot % 10) == 0):
return True
else:
return False
#-------------------------------------------------------------------------------
def test():
for no in nos:
print no
if validate(no):
print "Card number VALID"
else:
print "Card number INVALID"
#-------------------------------------------------------------------------------
def main():
i = 0
while i < max_numbers:
cc_no = gen(prefix)
if validate(cc_no):
print cc_no
else:
print "Card number %s - INVALID" % cc_no
cc_no = None
if cc_no:
i += 1
else:
pass
#-------------------------------------------------------------------------------
if __name__ == "__main__":
main(sys.argv[1:])
#-------------------------------------------------------------------------------
Generating User Profiles
This script generated user profiles along with associated (synthetically generated) credit card numbers.
#!/usr/bin/env python
#
# $Id:$
#
#-------------------------------------------------------------------------------
"""
Generate an abitrary collection of pseudo Credit Card numbers which
satisfy the validation test
"""
import sys
import random
import getopt
#-------------------------------------------------------------------------------
prefix = '1234'
max_digits = 16
max_numbers = 1000
#-------------------------------------------------------------------------------
cost_centers = [
["XX100000-X", "XXX DIVISION XX100000"],
["XX100001-X", "XXX DIVISION XX100001"],
...
]
#-------------------------------------------------------------------------------
def gen(prefix):
no = prefix
l = list(no)
i = len(prefix)
while (i < (max_digits - 1)):
x = random.randint(0, 9)
l.append(str(x))
# print i, l, x
i += 1
no = ''.join(l)
chk_digit = encode(no)
delta = 10 - chk_digit
if delta == 10:
delta = 0
# print chk_digit, delta
l.append(str(delta))
no = ''.join(l)
return no
#-------------------------------------------------------------------------------
def encode(no):
n = 0
tot = 0
for i in range(len(no)):
v = int(no[i])
if i % 2 == 0:
inc = v * 2
if v > 4:
n += 1
else:
inc = v
tot += inc
tot += n
chk = tot % 10
return chk
#-------------------------------------------------------------------------------
def validate(ccnumber):
cnt = 0
tot = 0
for i in range(len(ccnumber)):
val = int(ccnumber[i])
if i % 2 == 0:
inc = val * 2
if val > 4:
cnt += 1
else:
inc = val
tot += inc
tot += cnt
if ((tot % 10) == 0):
return True
else:
return False
#-------------------------------------------------------------------------------
def test():
for no in nos:
print no
if validate(no):
print "Card number VALID"
else:
print "Card number INVALID"
#-------------------------------------------------------------------------------
def gen_user_data():
out = open('Users.dat','w')
out.write("AGS_Number,FirstName,Username,Password,CostCenter,CreditCardNumber\r\n")
i = 0
no_centers = len(cost_centers)
while i < max_numbers:
center_idx = random.randint(0, no_centers - 1)
cost_center = cost_centers[center_idx][0]
cc_no = gen(prefix)
if validate(cc_no):
out.write("test_%03d,%03d,test%03d,test%03d,%s,%s\r\n" % \
(i, i, i, i, cost_center, cc_no))
else:
print "Card number %s - INVALID" % cc_no
cc_no = None
if cc_no:
i += 1
else:
pass
#-------------------------------------------------------------------------------
USAGE = """\
Usage:
$ ./gen_user_data.py [-d] [-v] [-f <filename>]
"""
def usage():
sys.stderr.write(USAGE)
#-------------------------------------------------------------------------------
def main(argv):
global debug_flg
global verbose_flg
global file
#----- Process command line arguments ----------------------------
try:
opts, args = getopt.getopt(argv, "df:hv", ["debug", "file=", "help", "verbose"])
except getopt.GetoptError:
usage()
sys.exit(2)
else:
for opt, arg in opts:
if opt in ("-d", "--debug"):
debug_flg = True
elif opt in ("-h", "--help"):
usage()
sys.exit(0)
elif opt in ("-f", "--file"):
logfile = arg
elif opt in ("-v", "--verbose"):
verbose_flg = True
gen_user_data()
#-------------------------------------------------------------------------------
if __name__ == "__main__":
main(sys.argv[1:])
#-------------------------------------------------------------------------------
Synthetic Expense Data
The following was used to generate synthetic credit card usage data for importing into the application via a batch import /upload process. This data was then used by LoadRunner scripts to journal expenses against cost codes for subsequent authorization and further processing.
#!/usr/bin/env python
#
#---------------------------------------------------------------------
import os
import csv
import sys
import getopt
import random
import datetime
#---------------------------------------------------------------------
debug_flg = False
max_flg = False
random_flg = False
verbose_flg = False
__version__ = '1.0.2'
file = None
no_days = 1
date = datetime.datetime.today()
dates = ['070729', '070730', '070731']
xcodes = [
'xxx',
...
'xxx'
]
#----- Set up credit card transactiuon type list ---------------------
cc_merchants = []
cc_merchants_in = open("cc_merchants.csv", "rb")
reader = csv.reader(cc_merchants_in)
for row in reader:
cc_merchants.append(row)
cc_merchants_in.close() # Explicitly close the file *NOW*
no_merchants = len(cc_merchants)
#----- Set up credit card numbers in cc_no list ----------------------
cc_no = []
cc_in = open("cc_no.txt", "rb")
reader = csv.reader(cc_in)
for row in reader:
cc_no.extend(row)
cc_in.close() # Explicitly close the file *NOW*
#----- Set up the file header and footer -----------------------------
header = """\
...
"""
footer = """\
...
"""
#----- Set up the body of the file -----------------------------------
max_no_tx = 10 # Number of transactions per CC
cost = 1000 # Cost of the transaction
tx_id = 0 # Number that appears in transaction description
def write_data(date):
global cost, tx_id
file_date = date.strftime("%y%m%d")
expense_date = (date - datetime.timedelta(days=1)).strftime("%y%m%d")
print "Generating expense data for '%s'" % expense_date
out = open(file_date,"w")
out.write(header % (file_date, expense_date))
for i in range(len(cc_no)):
if random_flg:
no_tx = random.randint(0, max_no_tx)
elif max_flg:
no_tx = 5
else:
no_tx = 1
tx_cnt = 0
total = 0.0
expense_lines = ''
while tx_cnt < no_tx:
cost = random.weibullvariate(alpha=3.0,beta=1) * 2000.0
type = cc_merchants[random.randint(0, no_merchants-1)]
expense_lines += "16,699,%.0f,,%s,,%s\n" % (cost, type[0], type[1])
total += cost
tx_cnt += 1
tx_id += 1
cost += 5
expense_block = "01,%s,,...,%03.0f,%d.../\n" % (cc_no[i], total, tx_cnt)
expense_block += expense_lines
expense_block += "99,...,%d/\n" % (tx_cnt + 2)
out.write(expense_block)
out.write(footer)
out.close()
#-------------------------------------------------------------------------------
USAGE = """\
Usage:
$ ./gen_user_data.py [-d] [-v] [-f <filename>]
"""
def usage():
sys.stderr.write(USAGE)
#-------------------------------------------------------------------------------
def main(argv):
global debug_flg
global max_flg
global random_flg
global verbose_flg
global file, date, no_days
#----- Process command line arguments ----------------------------
try:
opts, args = getopt.getopt(argv, "dD:f:hmn:rv",
["date", "debug", "file=", "help", "max", "no_days", "random", "verbose"])
except getopt.GetoptError:
usage()
sys.exit(2)
else:
for opt, arg in opts:
if opt in ("-d", "--debug"):
debug_flg = True
elif opt in ("-D", "--date"):
target_date = arg
date = datetime.datetime.strptime(target_date, "%Y%m%d")
print date
elif opt in ("-f", "--file"):
logfile = arg
elif opt in ("-h", "--help"):
usage()
sys.exit(0)
elif opt in ("-m", "--max"):
max_flg = True
elif opt in ("-n", "--no_days"):
no_days = int(arg)
elif opt in ("-r", "--random"):
random_flg = True
elif opt in ("-v", "--verbose"):
verbose_flg = True
dates = []
for n in range(no_days):
d = date - datetime.timedelta(days=n)
print d.strftime("%y%m%d")
dates.append(d)
# print date.strftime("%y%m%d")
for d in dates:
write_data(d)
#-------------------------------------------------------------------------------
if __name__ == "__main__":
main(sys.argv[1:])
#-------------------------------------------------------------------------------