Skip to content

Instantly share code, notes, and snippets.

@ap-Codkelden
Last active May 21, 2017 22:03
Show Gist options
  • Save ap-Codkelden/c5463ec3030007d22c1eaceb816450e3 to your computer and use it in GitHub Desktop.
Save ap-Codkelden/c5463ec3030007d22c1eaceb816450e3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (c) 2017 Renat Nasridinov
# This software may be freely distributed under the MIT license.
# https://opensource.org/licenses/MIT The MIT License (MIT)
import argparse
import json
import os
import sys
import calendar
from datetime import datetime as dt, timedelta, date, timezone
class Error(Exception):
pass
class TargetDirectoryIsNotExists(Error):
def __init__(self):
print('Вказана цільова директорія не існує, встановлено поточну.\n')
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
DATE_KEYS = ['DocTime', 'GLTime']
parser = argparse.ArgumentParser()
parser.add_argument('-d', '--directory', dest='json_dir', default='.',
help='цільова директорія, що містить JSON-файли з '
'результатами голосувань')
def last_sun(year_, month_):
c = calendar.Calendar(6)
weeks = c.monthdays2calendar(year_, month_)
last_week = weeks[-1]
sunday = last_week[0][0]
return date(year_, month_, sunday)
def is_dst(date_: str) -> timezone:
date_instance = dt.strptime(date_, DATE_FORMAT).date()
dst_start = last_sun(date_instance.year, 3)
dst_start += timedelta(6 - dst_start.weekday())
dst_end = last_sun(date_instance.year, 10)
dst_end += timedelta(6 - dst_end.weekday())
if dst_start <= date_instance < dst_end:
dst = 3
else:
dst = 2
return timezone(timedelta(hours=dst))
def convert_date(date_: str, tz: timezone) -> str:
p_date = dt.strptime(date_, DATE_FORMAT)
year, month, day, hour, minute, second = p_date.year, p_date.month, \
p_date.day, p_date.hour, p_date.minute, p_date.second
date2 = dt(year, month, day, hour, minute, second, tzinfo=tz)
iso8601_date = date2.strftime('%Y-%m-%dT%H:%M:%S%z',)
return iso8601_date
def check_dir(dir_: str) -> str:
try:
if not os.path.isdir(args.json_dir):
raise TargetDirectoryIsNotExists
return dir_
except TargetDirectoryIsNotExists:
return '.'
def get_jsondir_content(dir_: str) -> list:
try:
return [y for y in [f.path for f in os.scandir(dir_) if f.is_file()]
if os.path.splitext(y)[1].lower() == '.json']
except:
print('Неможливо прочтати каталог.\n')
sys.exit(1)
def date_replace(json_filename: str):
try:
with open(json_filename, encoding='utf-8') as f:
json_data = json.load(f)
except json.decoder.JSONDecodeError:
print("Помилка парсингу файлу '{}', пропуск...\n".format(json_filename))
return
for key in DATE_KEYS:
if key in json_data:
tz = is_dst(json_data[key])
json_data[key] = convert_date(json_data[key], tz)
try:
with open(json_filename, 'w', encoding='utf-8',) as f:
json.dump(json_data, f, ensure_ascii=False,)
except:
raise
return 0
def main(args_):
json_dir = args_.json_dir
if json_dir != '.':
json_dir = check_dir(json_dir)
dir_content = get_jsondir_content(json_dir)
if not dir_content:
print('JSON-файли у цільовій директорії відсутні.\n')
sys.exit(0)
for json_filename in dir_content:
date_replace(json_filename)
if __name__ == "__main__":
args = parser.parse_args()
main(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment