def prosessermappe(mappenavn, **kwargs): """ Finner og prsoesserer alle json-filer (metadata vegbilder) i angitt mappenavn Søker gjennom alle undermapper og støvsuger etter navn på json-filer som så sendes til funksjonen prosesser( filnavn ) ARGUMENTS: mappenavn KEYWORDS: Hva som helst - alle nøkkelord blir alle videresendt til funksjonen prosesser RETURNS: Nada """ logdir = 'loggdir' logname = 'loggnavn' duallog.duallogSetup(logdir=logdir, logname=logname) t0 = datetime.now() filer = finnfiltype(mappenavn, filetternavn='.json') logging.info('Prosessermappe- klar til å prosessere ' + str(len(filer)) + ' metadata-filer under ' + mappenavn) antall_fiksa = 0 for filnavn in filer: antall_fiksa += prosesser(filnavn, **kwargs) tidsbruk = datetime.now() - t0 logging.info('Prosessermappe - fiksa ' + str(antall_fiksa) + ' filer under ' + mappenavn + ' tidsbruk: ' + str(round(tidsbruk.total_seconds())) + ' sekund')
def prosesser_fiksfilnavn(mappenavn, loggfilnavn=None, dryrun=False): """ Finner og sjekker filnavn opp mot datainnhold for alle json-filer (metadata vegbilder) i angitt mappenavn Søker gjennom alle undermapper og støvsuger etter navn på json-filer som så sendes til funksjonen filks_sjekkfilnavn ( jsondata, filnavn ) ARGUMENTS: mappenavn KEYWORDS: loggfilnavn: None eller tekststreng. Hvis angitt logges filnavn på alle ikke-godkjente filer til dette filnavnet. TODO: IKKE IMPLEMENTERT (ennå) dryrun: Boolsk, False (default) | True. Kjører analyseprosessen, men uten å gjøre reelle endringer i (meta)data på disk RETURNS: Nada """ logdir = 'loggdir' logname = 'loggnavn' duallog.duallogSetup(logdir=logdir, logname=logname) filer = finnfiltype(mappenavn, filetternavn='.json') logging.info('Klar til å sjekke/fikse filnavn for ' + str(len(filer)) + ' filer under ' + mappenavn) antall_fiksa = 0 for filnavn in filer: jsondata = lesjsonfil(filnavn) (jsondata, filnavn, modified) = fiks_sjekkfilnavn(jsondata, filnavn, dryrun=dryrun) if modified: antall_fiksa += 1 if not dryrun: skrivjsonfil(filnavn, jsondata) oppdatert = 'Fant og fiksa filnavnfeil i ' if dryrun: oppdatert = 'Fant, men fiksa IKKE filnavnfeil i ' if antall_fiksa > 0: logging.info(oppdatert + str(antall_fiksa) + ' vegbilder i mappe ' + mappenavn) else: logging.info('Fant ingen filnavnfeil i ' + mappenavn)
fname = os.path.join(mappenavn, 'dummy.txt') nymappe = Path(mappenavn) nymappe.mkdir(parents=True, exist_ok=True) logging.info(fname) with open(fname, 'w') as f: f.write('Hahahaha') if __name__ == "__main__": versjonsinfo = "Test tegnsett mappenavn versjon 1.2, 19.06.2019 kl 14:49" logdir = 'loggfiler_testmappenavn' logname = 'testmappenavn_' duallog.duallogSetup(logdir=logdir, logname=logname) logging.info(versjonsinfo) if len(sys.argv) < 2: print("BRUK:\n") print('testmappenavn.exe oppsettfil_flyttvegbilder.json\n') time.sleep(1.5) else: if '.json' in sys.argv[1][-5:].lower(): print('flyttvegbilder.exe: Leser oppsettfil fra', sys.argv[1]) with open(sys.argv[1]) as f: oppsett = json.load(f)
def prosesser(filnavn, dryrun=False): """ Retter opp datafeil og mangler i vegbilde-json OVerskriver gammal json-fil hvis nødvendig (dvs kun hvis det er gjort endringer) ARGUMENTS filnavn - fil- og mappenavn til json-fil med metadata for vegbildet KEYWORDS dryrund = False Sett til True for å få detaljert utlisting av alle endringer som normalt ville blitt gjort (men uten at endringene faktisk gjennomføres. ) RETURNS Antall filer som er endra- 0 eller 1. TODO: Sjekk at vi har veglenkeID og posisjon, hent dem hvis nødvendig. Gjenbruk i så fall data til å fikse exif_roadident og senterlinjeposisjon """ logdir = 'loggdir' logname = 'loggnavn' duallog.duallogSetup(logdir=logdir, logname=logname) fiksa = 0 fiksa_filnavn = 0 skrevet = 0 jsondata = lesjsonfil(filnavn, ventetid=1) # Fikser ting (jsondata, tmp) = fiks_vegtilknytning(jsondata, filnavn, dryrun=dryrun) fiksa += tmp (jsondata, tmp) = fiks_senterlinjeposisjon(jsondata, filnavn, dryrun=dryrun) fiksa += tmp (jsondata, tmp) = fiks_exif_roadident(jsondata, filnavn, dryrun=dryrun) fiksa += tmp # (jsondata, filnavn, tmp) = fiks_sjekkfilnavn( jsondata, filnavn, dryrun=dryrun) # fiksa_filnavn += tmp if dryrun: if fiksa > 0: logging.info('Dryrun-prosessering: behov for oppdatering av ' + filnavn) else: logging.info('Dryrun-prosessering: Ingen feil funnet i ' + filnavn) elif fiksa > 0: if sjekkegenskapverdi(jsondata, 'exif_kvalitet', 'int') and int( jsondata['exif_kvalitet']) in [0, 1, 2]: jsondata['exif_kvalitet'] = int(jsondata['exif_kvalitet']) + 0.5 elif sjekkegenskapverdi(jsondata, 'exif_kvalitet', 'float'): logging.warning( "Pussig kvalitetsverdi - er fila prosessert før? exif_kvalitet=" + jsondata['exif_kvalitet'] + ' ' + filnavn) skrivjsonfil(filnavn, jsondata) logging.info('Prosessering - retta mangler: ' + jsondata['bildeid'] + ' ' + filnavn) skrevet = 1 try: kvalitetskontroll(jsondata, filnavn) except AssertionError as myErr: logging.error(str(myErr)) if fiksa_filnavn > 0: logging.warning("Endret feil filnavn på " + str(fiksa_filnavn) + " vegbilder (.jpg, .json, .webp)") return skrevet
def testing(testdata='testdata', tempdir='testdata_temp', logdir='test_loggdir', logname='test_loggnavn', huggMappeTre=3): """ Kjører gjennom testdata Kopierer mappen med testdata til en midlertidig katalog (som overskrives, hvis den finnes fra før). Anvender deretter alle kvalitetssikrings / kvalitetsheving-rutiner på testdata. """ duallog.duallogSetup(logdir=logdir, logname=logname) testfiler = finnfiltype(testdata, filetternavn='.json') fremhev = ' ====> ' logging.info(' ') logging.info(fremhev + 'Forbereder test') logging.info(' ') logging.info(fremhev + 'Kopierer testdata-mappe fra ' + testdata + ' => ' + tempdir) copy_tree(testdata, tempdir) logging.info(' ') logging.info(fremhev + 'Kvalitetskontroll, ikke prosesserte filer i ' + tempdir) logging.info(' Her kommer det masse WARNING-meldinger...\n') kopiertefiler = finnfiltype(tempdir, '.json') for filnavn in kopiertefiler: jsondata = lesjsonfil(filnavn, ventetid=1) try: kvalitetskontroll(jsondata, filnavn) except AssertionError as myErr: logging.warning(str(myErr)) logging.info(' ') logging.info(fremhev + 'Prosesserer flat filstruktur-mappe ' + tempdir + '/allefiler_flatt\n') prosessermappe(tempdir + '/allefiler_flatt') logging.info(' ') logging.info(fremhev + 'Finner undermapper til ' + tempdir + str(huggMappeTre) + ' nivåeer ned, prosesserer hver enkelt undermappe\n') finnundermapper(tempdir, huggMappeTre=huggMappeTre) logging.info(' ') logging.info(fremhev + 'Sluttkontroll prosesserte data i ' + tempdir + '...\n') for filnavn in kopiertefiler: jsondata = lesjsonfil(filnavn, ventetid=1) try: kvalitetskontroll(jsondata, filnavn) except AssertionError as myErr: logging.warning(str(myErr))
def finnundermapper(mappenavn, typeprosess='posisjon', huggMappeTre=None, firstIterasjon=True, **kwargs): """ Deler et (potensielt kjempedigert) mappetre i mindre underkataloger. Hensikten er å unngå å prøve å finne millionvis av json-filer i en katalog. I stedet finner vi alle underkataloger (og evt underkataloger til dem igjen), inntil et nærmere angitt nivå relativt under rot-mappa. Parameteren huggMappeTre angir hvor mange nivåer av underkataloger vi skal dele opp med. ARGUMENTS: mappenavn - navn på katalogen vi skal støvsuge for metadata-filer (json) KEYWORDS: huggMappeTre: None, 0 eller antall nivåer vi skal gå nedover før vi sender under(under)katalogen til prosessermappe( underkatalog) typeprosess: tekststreng, 'posisjon' | 'filnavn' | 'alle'. Hva slags type prosess som skal kjøres på metadata. Aktuelle verdier: 'posisjon' (default): Fikser opp i vegtilknytning, finner posisjon etc. 'filnavn' Sjekker filnavn, logger filnavn-feil og evt retter opp filnavnet i metadata. firstiteration: Holder styr på om vi er første nivå i iterasjonen. Ikke tukle med denne! RETURNS: Nada """ logdir = 'loggdir' logname = 'loggnavn' duallog.duallogSetup(logdir=logdir, logname=logname) t0 = datetime.now() if huggMappeTre: logging.info("finner undermapper til: " + mappenavn) huggMappeTre = huggMappeTre - 1 folders = [f for f in glob.glob(mappenavn + "/*/")] for undermappe in folders: logging.info("fant undermappe: " + undermappe) finnundermapper(undermappe, huggMappeTre=huggMappeTre, firstIterasjon=False, **kwargs) else: logging.info("Starter proseessering av undermappe: " + mappenavn) if typeprosess.lower() in ['posisjon', 'alle']: prosessermappe(mappenavn, **kwargs) if typeprosess.lower() in ['filnavn', 'alle']: prosesser_fiksfilnavn(mappenavn, **kwargs) if firstIterasjon: tidsbruk = datetime.now() - t0 logging.info("Ferdig med å gå gjennom alle undermapper til " + mappenavn + ", tidsbruk " + str(round(tidsbruk.total_seconds())) + ' sekund')
import logging from formatsjekk import kvalitetskontroll, finnfiltype, filnavndata from flyttvegbilder_v54 import lesjsonfil import duallog duallog.duallogSetup( logdir='loggdir', logname='loggfil') filer = finnfiltype( 'testdata/allefiler_flatt', '.json' ) for filnavn in filer: jsondata = lesjsonfil( filnavn) try: kvalitetskontroll( jsondata, filnavn) except AssertionError as myErr: logging.warning( myErr) # sjekker funksjonen filnavndata filnavn = 'Fy06_Ev134_hp04_f1_m00031' filnavnsvar = { 'fylke': 6, 'vegkat': 'E', 'vegstat': 'v', 'vegnr': 134, 'hp': 4, 'felt': 1, 'meter': 31} try: assert filnavndata( filnavn) == filnavnsvar, 'funksjon filnavndata gir feil svar' assert filnavndata( filnavn + '.json') == filnavnsvar, 'funksjon filnavndata gir feil svar ved filetternavn .json' assert filnavndata( filnavn + '.jpg') == filnavnsvar, 'funksjon filnavndata gir feil svar ved filetternavn .jpg'