jonnor Skrevet 17. mai 2008 Del Skrevet 17. mai 2008 (endret) Scriptet lager symbolske linker av filer fra flere mapper og legger de i en enkelt mappe. Noen kommentarer fra mer erfarne programmerere? ( på evt bugs, metode, struktur osv...) import os #idir = ['name/of/input/directory1', 'name of input/directory2'] (places of the original files) idir = ['/home/jon/i1', '/home/jon/i2'] #odir = '/name/of/output/directory' (place where links will be placed) odir = '/home/jon/out' if not os.access(odir,os.F_OK): print 'output directory ' + odir + ' does not seem to exist' else: for folder in idir: if not os.access(folder,os.F_OK): print 'input directory ' + folder + ' does not seem to exist' else: for obj in os.listdir(folder): lnkobj = odir + '/' + obj orgobj = folder + '/' + obj if not os.access(lnkobj,os.F_OK): os.symlink(orgobj,lnkobj) print 'links from ' + folder + ' succesfully created' En ide kunne kanskje vært å lage en liste over originalfiler i mappene og en over linker, for å skape en liste over hvilke filer det ikke eksisterer linker for, og så skape disse. Kanskje en litt "ryddigere" måte å gjøre det på... EDIT: scriptet vil ikke være fullgodt dersom det eksisterer flere filer med identiske navn (i ulike mapper). Kun en link vil da opprettes. Noen som har forslag til hvordan dette kan løses? En mulighet er jo å skjekke hvor symlinken peker hver gang man finner en fil som tilsynelatede allerede har en symlink. Dersom den peker til en annen mappe enn den man jobber på så oppretter man en symlink og legger til noe i filnavnet slik at den skiller seg ut fra den andre symlinken. Endret 18. mai 2008 av NorthWave Lenke til kommentar
argonaut Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 Scriptet lager symbolske linker av filer fra flere mapper og legger de i en enkelt mappe. Noen kommentarer fra mer erfarne programmerere? ( på evt bugs, metode, struktur osv...) ... En ide kunne kanskje vært å lage en liste over originalfiler i mappene og en over linker, for å skape en liste over hvilke filer det ikke eksisterer linker for, og så skape disse. Kanskje en litt "ryddigere" måte å gjøre det på... EDIT: scriptet vil ikke være fullgodt dersom det eksisterer flere filer med identiske navn (i ulike mapper). Kun en link vil da opprettes. Noen som har forslag til hvordan dette kan løses? En mulighet er jo å skjekke hvor symlinken peker hver gang man finner en fil som tilsynelatede allerede har en symlink. Dersom den peker til en annen mappe enn den man jobber på så oppretter man en symlink og legger til noe i filnavnet slik at den skiller seg ut fra den andre symlinken. Noen kommentarer: Struktur: 1. Du har ofte bruk for en magisk første linje som forteller shellet hvordan det skal kjøre fila: #!/usr/bin/python eller #!/usr/bin/env python Se Python-tutorialen 2. Du bør ha en docstring øverst i fila, som i det minste sier kort hva skriptet er og gjør, med ett kjøreeksempel. F.eks.: """ This script does... Example: $ myscript.py """ Se PEP 257 "Docstring Conventions" http://www.python.org/dev/peps/pep-0257/ 3. Modularisering: Vurder å modularisere skriptet, slik at kjernen kan brukes om igjen. Lag en funksjon av link-opprettingen, f.eks. def make_symlinks(idirs, odir): # Hovedparten av skriptet, unntatt initialisering av inputs og outputs. if __name__ == "main": # 1. Get and initialize parameters. idirs = ... odir = ... # 2. Run the symlink processing make_symlink(idirs, odir) Funksjonen make_symlink() kan nå gjenbrukes i andre programmer, f.eks (gitt at det ovenstående er lagret i en fil ved navn mymod.py): import mymod ... mymod.make_symlinks(...) Se Defining Functions i Python-tutorialen. Få med deg avsnittet om moduler også, når du er moden for det. 4. Kommandolinjeparametre: Vurder å gjøre inputs og outputs til skriptet til kommandolinjeparametre. Det kan gjøres så enkelt som å aksessere sys.argv, og plukke ut parametre fra forventede posisjoner, med evt. håndskrevet validering, noe á la (dette støtter bare en input-katalog): import sys ... # Forventer syntaksen: $ myscript.py input-dir output-dir idir = sys.argv[1] odir = sys.argv[2] make_symlinks(idir, odir) Men for bedre vedlikeholdbarhet, validering, og automatisk håndtering av standardfunksjonalitet, som "--help" og "--version", anbefaler jeg deg å sette deg inn i optparse. 5. Konstruksjon av filnavn: I hovedregelen bør du ikke gjøre dette manuelt med strengkonkatenering, fordi det ikke er portabelt. Den portable løsningen er os.path.join(). Når det gjelder filer med identiske basenavn, må du antakeligvis enten implementere en form for navne-mangling (f.eks. "/a/b/c/fil.txt" -> "a_b_c_fil.txt"), eller opprette foreldrekatalogene til filene i destinasjonskatalogen også, for at det fullstendige filnavnet skal bli unikt. I begge tilfeller må du granske filnavn og plukke ut katalogdeler. Funksjoner i os.path er nyttige her: basename(), dirname(), split(). argonaut Lenke til kommentar
meastp Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Om du ønsker å traversere mapper rekursivt, kan du ta en titt på os.walk(). Lenke til kommentar
Xecuter Skrevet 6. juni 2008 Del Skrevet 6. juni 2008 Ser du lager selv funksjoner som allerede eksisterer i os.path. Lesestoff. Keep this under your pillow. F.eks.: I stedet for "if not os.access(folder,os.F_OK):" kan du bruke "if not os.path.exists(path)" Og istedet for lnkobj = odir + '/' + obj orgobj = folder + '/' + obj har du "os.path.join(path1, path2)". Også har du jo os.walk som meastp nevnte. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå