За счет предварительной обработки ввода req
вы можете избежать необходимости re
:
req = {
'start': 19851123,
'end': 19851124,
'vars': ['TEMP'],
'stns': ['235:240'],
}
urllib.parse.urlencode(req, doseq=True, safe=':')
# 'start=19851123&end=19851124&vars=TEMP&stns=235:240'
Так что вы можете ограничить свой код:
from urllib.parse import urlencode
from urllib.request import urlopen
def main(parameters, url='http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi'):
query = urlencode(parameters, doseq=True, safe=':')
with urlopen('{}?{}'.format(url, query)) as fhand:
for line in fhand:
if not line.startswith(b'#'):
yield line.decode().strip()
if __name__ == '__main__':
req = {
'start': 19851123,
'end': 19851124,
'vars': ['TEMP'],
'stns': ['235:240'],
}
for line in main(req):
print(line)
Но это такнеудобно изменять пользовательский ввод, поэтому может быть полезно использовать argparse
.На первый взгляд, vars
и stns
могут иметь различную длину, поэтому вы можете воспользоваться действием 'append'
с определенной обработкой по умолчанию:
import argparse
from urllib.parse import urlencode
from urllib.request import urlopen
def command_line_parser():
parser = argparse.ArgumentParser()
parser.add_argument('start', type=int)
parser.add_argument('end', type=int)
parser.add_argument('-v', '--vars', action='append')
parser.add_argument('-s', '--stns', action='append', nargs=2, type=int)
return parser
def parse_command_line(parser):
args = parser.parse_args()
if args.vars is None:
args.vars = ['TEMP']
if args.stns is None:
args.stns = [(235, 240)]
args.stns = ['{}:{}'.format(*stn) for stn in args.stns]
return args
def main(parameters, url='http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi'):
query = urlencode(parameters, doseq=True, safe=':')
with urlopen('{}?{}'.format(url, query)) as fhand:
for line in fhand:
if not line.startswith(b'#'):
yield line.decode().strip()
if __name__ == '__main__':
for line in main(vars(parse_command_line(command_line_parser()))):
print(line)
Используется что-то вроде
$ python script.py -v TEMP -v TEST -s 235 240 19851123 19851124
, что будет запрашивать следующий URL:
http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi?start=19851123&end=19851124&vars=TEMP&vars=TEST&stns=235:240