Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 1009
http://pastebin.com/yc2dFVeL

Lager et program (python 2.7) som skal flytte filer fra en bestemt mappe, avhengig av ekstensjonen på filen(e) til en annen mappe. F.eks. "file.txt" flyttes til "../my_documents", mens "file.png" flyttes til "../my_pictures". Noen innspill i koden? Trenger jeg mer sikkerhet for å forhindre at data ikke blir tapt under flyttingen?

Koden kopierer filene for øyeblikket, men det skal endres til flytting. Flere ekstensjoner og mapper skal legges til etterhvert.
Sist endret av Prognisse; 10. mai 2013 kl. 16:40.
annet enn at "command-line UI" er noe herk, så skal det funke helt greit. Jeg ville helt klart heller tatt inn userinput som argumenter i scriptet da det gjør det mye enklere å bruke, samt at man kan automatisere ting lettere da. Ved å bruke ArgumentParser klassen vil du også lett få opp en hjelpemeny over hva slaks argumenter du ønsker.

Utover dette ville jeg catchet exception som skjer om kopiering/flytting/sletting feiler. Dette er en IOError-exception. Da kan du håndtere det på ønsket måte, eller bare skrive en fornuftig feilmelding til brukeren.

Vil legge til en liten ting til, det er og en "kjent" måte å avslutte programmet ved å trykke "CTRL+C" som vil gi deg en KeyboardException". Koden din burde ta hånd om det på en fin måte.
Sitat av etse Vis innlegg
Vil legge til en liten ting til, det er og en "kjent" måte å avslutte programmet ved å trykke "CTRL+C" som vil gi deg en KeyboardException". Koden din burde ta hånd om det på en fin måte.
Vis hele sitatet...
"KeyboardInterrupt" er riktig exception.
Ser du deklarerer en variabel "cls", for å cleare cmd'en på windows bruker du bare os.system("cls")
Sitat av reaVen Vis innlegg
Ser du deklarerer en variabel "cls", for å cleare cmd'en på windows bruker du bare os.system("cls")
Vis hele sitatet...
Vil bare legge til at man burde være forsiktig med å venne seg til å bruke slike kommandoer da det ødelegger hele "Plattform-uavhengigheten" av python. Det der vil f.eks. ikke fungere på OS hvor kommandoen er "clear" i stede for "cls".

Kode

def copy_doc():
        pathname=os.path.join(my_space, basename)
        if os.path.isfile(pathname):
                shutil.copy2(pathname, my_documents)
               
def copy_pic():
        pathname=os.path.join(my_space, basename)
        if os.path.isfile(pathname):
                shutil.copy2(pathname, my_pictures)
Du bør forsøke å unngå duplisert kode. For eksempel som dette:

Kode

def copy_file_to(target_dir):
        pathname=os.path.join(my_space, basename)
        if os.path.isfile(pathname):
                shutil.copy2(pathname, target_dir)
               
def copy_doc():
        copy_file_to(my_documents)

def copy_pic():
        copy_file_to(my_pictures)
Jeg ville trolig også gjort disse funksjonene uavhengige av globale variabler.., i alle fall basename - den ville jeg sendt inn som argument.

Jeg ville også ha samlet avgjørelsen om kopi-operasjonen skal gjøres i en funksjon - nå sjekker du filendelsen i hovedløkken mens du sjekker om det er en fil i kopi-funksjonen. I stedet hadde jeg nok laget noe ala:

Kode

def is_doc(basename):
    pathname=os.path.join(my_space, basename)
    return basename.endswith(doc) and os.path.isfile(pathname)
Da blir kopifunksjonene enda enklere...

pathname hadde jeg nok også opprettet i løkken. Kanskje du kan sende denne til de ulike funksjonene i stedet for basename (som du egentlig ikke trenger)...

DISCLAMER: Jeg kan ikke Python så veldig godt
Noen innspill i koden?
Vis hele sitatet...
Fine råd fra tormaroe.
prøv og se litt på PEP-8 følg råd som og ikke bruke 8 space Indentering(alltid 4 space).
Jeg ville trolig også gjort disse funksjonene uavhengige av globale variabler.., i alle fall basename - den ville jeg sendt inn som argument.
Vis hele sitatet...
Helt enig ville sent inn det meste som argumenter.
Prøve og holde "global namespace" så ren som mulig,dette gjør det også mye lettere viss du vil utvide og teste koden.

Kan skive om copy_file_to funksjon for også ta seg av Race condition
Ville også sent "my_space, basename" inn som argumenter og flyttet doc,pic inn i en funksjon.

Kode

def copy_file_to(my_space, basename, target_dir):
    '''Use with open and <try,except> will also catch race condition'''
    pathname = os.path.join(my_space, basename)
    try:
        with open(pathname) as path:
            shutil.copy2(path.name, target_dir)
    except IOError as error:
        return 'A problem occurred: {}'.format(error)