Jeg sidder med følgende problemstilling, som jeg håber at I kan hjælpe mig med.
"Find alle filer (af typen .py/.xml) i en mappe og alle undermapper herunder som opfylder følgende: Der skal være mindst en streng (indkapslet i "" eller ''), som ikke har en funktion MSGR("") rundt om sig. Returner navnet på de filer der opfylder kriterier samt linjenumre heri hvor at der er fundet noget."
Den bagvedliggende forklaring er at jeg ønsker at få alle strenge i mine filer indkapslet i en MSGR()-funktion for oversættelses øjemed.
Til min rådighed har jeg det meste af hvad der kan flyve på et linux-system, men det skal helst kunne laves i et standard Shell-script eller Python-program. Jeg kunne forestille mig at det var en let ting at lave ved brug af et regexp i midten. Det behøver ikke være noget fancy - jeg skal sådan set bare bruge noget der virker, og så lære lidt heraf.
Hvis jeg ikke har forklaret problemstillingen godt nok må i endelig skrive tilbage med spørgsmål og jeg skal forsøge at klargøre.
#!/usr/bin/env python # -*- coding: UTF-8 -*- # """ filename findStrgs.py """ import findfiler import grep Query = """ Jeg sidder med følgende problemstilling, som jeg håber at I kan hjælpe mig med.
"Find alle filer (af typen .py/.xml) i en mappe og alle undermapper herunder som opfylder følgende: Der skal være mindst en streng (indkapslet i "" eller ''), som ikke har en funktion MSGR("") rundt om sig. Returner navnet på de filer der opfylder kriterier samt linjenumre heri hvor at der er fundet noget."
Den bagvedliggende forklaring er at jeg ønsker at få alle strenge i mine filer indkapslet i en MSGR()-funktion for oversættelses øjemed.
Til min rådighed har jeg det meste af hvad der kan flyve på et linux-system, men det skal helst kunne laves i et standard Shell-script eller Python-program. Jeg kunne forestille mig at det var en let ting at lave ved brug af et regexp i midten. Det behøver ikke være noget fancy - jeg skal sådan set bare bruge noget der virker, og så lære lidt heraf.
Hvis jeg ikke har forklaret problemstillingen godt nok må i endelig skrive tilbage med spørgsmål og jeg skal forsøge at klargøre. """
#!/usr/bin/env python # -*- coding: UTF-8 -*- """Usage: python findfiler [-v] [<path>] [-s <suffix> ] [-S <IgnoresSuffix>] [-D <IgnoreDir>] <path>: default to "." angiver søgnings startpunkt <IgnoresSuffix>: Sufix to ignore defalt to [] <IgnoreDir>: dirs to ignore defalt to [] Returns a list off filenames """ import sys import os from os.path import isfile
def find(Path=".", onlySuffix=set(), IgnoreSuffix=set(), IgnoreDirs=set(), vim="" ): """find [<path>] [<IgnoresSuffix>] [<IgnoreDir>] <path>: default to "." angiver søgnings startpunkt <onlySuffix> : only this suffix <IgnoresSuffix> : Sufix to ignore defalt to [] <IgnoreDir> : dirs to ignore defalt to [] <vim> : drop files ending with this string Returns a list off filenames ignoring pipes. """ Foundnames = [] for dirpath, dirnames, filenames in os.walk( Path ) : Idirs = set(tuple(Dir for Dir in dirpath.split("/"))) if Idirs.intersection( IgnoreDirs): continue for fname in filenames : if not isfile(fname): continue suffix=fname.split(".")[-1] if vim and fname.endswith(vim): continue if onlySuffix: if suffix not in onlySuffix: continue elif suffix in IgnoreSuffix: continue Foundnames.append( "%(dirpath)s/%(fname)s" % vars() ) return Foundnames
Ser rigtigt godt ud. Sidder lige og prøver at få det op at flyve. Får følgende syntaks fejl, da jeg ikke umiddelbart er skarp i Python, kan du så se den?
Traceback (most recent call last): File "findStrgs.py", line 7, in ? import findfiler File "/users/alexa/work/Customization/dsb_user/findfiler.py", line 24 Idirs = set(tuple(Dir for Dir in dirpath.split("/"))) ^
Desuden ønsker jeg at kunne finde arbitrære strenge og ikke bare Hello world'er. Men så vidt jeg kan gennemskue kunne dette hurtigt ændres i SearchString = """'Hello world'|[^(]"Hello world"|MSGR('Hello world')""" hvor jeg måske bare kunne erstatte Hello world med en * (stjerne) e.lign.?
Traceback (most recent call last): File "findStrgs.py", line 7, in ? import findfiler File "/users/alexa/work/Customization/dsb_user/findfiler.py", line 13, in ? def find(Path=".", onlySuffix=set(), IgnoreSuffix=set(), IgnoreDirs=set(), vim="" ): NameError: name 'set' is not defined
du ændrer alle set([...]) til [...] og i findfiler.py ændrer du linierne Idirs = set(tuple(Dir for Dir in dirpath.split("/"))) if Idirs.intersection( IgnoreDirs): continue
til Idirs = [ Dir for Dir in dirpath.split("/") if Dir in IgnoreDirs ] if Idirs: continue
Tak for din hjælp. Ændrede det efter dine forslag og nu kører det. Desværre er der et par få problemer tilbage. Du giver pokkers god hjælp, så hvis du lige hjælper mig i mål, kan vi nok godt finde ud af noget med lidt flere point.
Jeg lavede en testfil, som burde kunne findes, indeholdende følgende linje:
Denne fil "boer" kunne findes.
Den blev også fundet hvis den lå i samme udgangsmappe som dit program men ikke hvis den lå i undermapper. Så lavede jeg en anden testfil, som ikke burde findes da den ikke opfylder kriterier:
Denne fil boer ikke kunne findes.
Denne fil blev desværre også fundet, så det virker som om at det regulære udtryk ikke virker helt efter planen. Jeg benytter SearchString = """'.+'|[^(]".+"|MSGR('.+')""", men det lader ikke helt til at virke. Kriteriet var som bekendt at finde alle strenge der enten var "xxx" eller "yyy" eller MSGR('zzz') (arbitrær længde > 0) men ikke MSGR("www").
Hej, se bort fra ovenstående kommentarer. Må erkende at jeg har sovet i timen og kørt den forkerte fil. Så der blev aldrig kørt reg-udtryk på filen.
Den søger dog stadig ikke ned i underbiblioteker, men jeg vil kigge lidt videre på det, burde være til at hitte ud af. Vil ikke have at du laver unødigt arbejde ift. min dumhed med regulære udtryk-fejlen :-)
Har fundet fejlen. Den lå i find-funktionen. Følgende
if not isfile(fname): continue
Gav altid continue når at filen ikke lå i samme sti som udgangspunkt. Kunne nok rettes med at concatinere stien på istedet for fname, så dirpath + fname agtigt noget. Jeg udkommenterede de to linjer og det fungerede også fint.
Så fik vi jo hjulpet begge veje :-) if isfile( "%s/%s" % (dirpath, fname ) ):
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.