L'esercizio Copia speciale è abbinato al materiale del file system e dei comandi esterni nella sezione Programmi di utilità Python. Questo esercizio è nella sezione "copyspecial" all'interno di google-python-exercises (scarica google-python-exercises.zip se non lo hai già fatto; vedi Configurazione per i dettagli). Aggiungi il codice in copyspecial.py.
Il programma copyspecial.py prende una o più directory come argomenti. Diciamo che è un'offerta il nome contiene il pattern __w__ da qualche parte, dove w è costituito da uno o più caratteri della parola. La funzione main() fornita include il codice per analizzare gli argomenti della riga di comando, ma il resto spetta a te. Scrivi le funzioni per implementare le caratteristiche seguenti e modificare main() per chiamare le tue funzioni.
Funzioni suggerite per la soluzione(dettagli di seguito):
- get_special_paths(dir) -- restituisce un elenco di percorsi assoluti dei file speciali nella directory specificata.
- copy_to(paths, dir) dato un elenco di percorsi, copia i file nella directory specificata
- zip_to(paths, zippath) con un elenco di percorsi, comprimi i file nel file ZIP specificato
Parte A (manipolazione dei percorsi dei file)
Raccogli un elenco dei percorsi assoluti dei file speciali in tutte le directory. Nel caso più semplice, è sufficiente stampare l'elenco (qui il punto "." dopo il comando è un singolo argomento che indica la directory corrente). Stampa un percorso assoluto per riga.
$ ./copyspecial.py . /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
Partiamo dal presupposto che i nomi non vengano ripetuti tra le directory (facoltativo: verifica questo presupposto ed effettua un errore nel caso in cui sia stato violato).
Parte B (copia dei file)
Se il parametro "--todir dir" è presente all'inizio della riga di comando, non stampare nulla, ma copia i file nella directory specificata creandoli se necessario. Utilizzare il modulo Python "shutil" per la copia di file.
$ ./copyspecial.py --todir /tmp/fooby . $ ls /tmp/fooby xyz__hello__.txt zz__something__.jpg
Parte C (chiamare un programma esterno)
Se il file ZIP "--tozip" all'inizio della riga di comando, esegui questo comando: "zip -j zipfile <list all the files>". Verrà creato un file ZIP contenente i file. Per divertimento/rassicurazione, stampa anche la riga di comando che eseguirai per prima (come mostrato nella lezione). Nota per Windows: per impostazione predefinita, Windows non include un programma per produrre archivi .zip standard, ma puoi scaricare il programma zip senza costi e aperto da www.info-zip.org.
Per gli utenti Linux, se non ha installato zip
,
può installarlo chiamando sudo apt install zip
.
$ ./copyspecial.py --tozip tmp.zip .Command I'm going to do:zip -j tmp.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
Se il processo secondario si chiude con un codice di errore, esci con un codice di errore e stampa l'output del comando. Per eseguire il test, prova a scrivere un file ZIP in una directory che non esiste.
$ ./copyspecial.py --tozip /no/way.zip .Command I'm going to do:zip -j /no/way.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
zip I/O error: No such file or directory zip error: Could not create output file (/no/way.zip)