Ćwiczenie specjalne obejmuje badanie systemu plików i poleceń zewnętrznych w sekcji Python Utilities (Narzędzia w języku Python). To ćwiczenie znajduje się w katalogu „copyspecial” w google-python-exercises (pobierz plik google-python-exercises.zip, jeśli jeszcze go nie masz w sekcji Konfiguracja). Dodaj kod w pliku copyspecial.py.
Program copyspecial.py przyjmuje jako argumenty co najmniej jeden katalog. Zapisujemy, że plik „specjalny” zawiera ciąg znaków „__w__”, gdzie „W” to znak co najmniej jednego słowa. Podana funkcja main() zawiera kod do analizowania argumentów wiersza poleceń, ale reszta zależy od Ciebie. Utwórz funkcje implementujące poniższe funkcje, a następnie zmodyfikuj metodę main(), aby wywołała Twoje funkcje.
Sugerowane funkcje dla Twojego rozwiązania(szczegóły poniżej):
- get_special_paths(dir) – zwraca listę bezwzględnych ścieżek do plików specjalnych w danym katalogu.
- copy_to(paths, dir) zawierające listę ścieżek, kopiuje pliki do danego katalogu
- zip_to(paths, zippath) z podaną listą ścieżek, spakuj te pliki do danego pliku ZIP
Część A (zmienianie ścieżek do plików)
Zbierz listę bezwzględnych ścieżek do plików specjalnych we wszystkich katalogach. W najprostszym przypadku po prostu wydrukuj tę listę (znak „.” po poleceniu to pojedynczy argument wskazujący bieżący katalog). Drukuj jedną ścieżkę bezwzględną w każdym wierszu.
$ ./copyspecial.py . /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
Zakładamy, że nazwy nie powtarzają się w katalogach (opcjonalnie: sprawdź to założenie i wyeliminuj błędy, jeśli zostały naruszone).
Część B (kopiowanie plików)
Jeśli na początku wiersza poleceń znajduje się opcja „--todir dir”, nie drukuj niczego, tylko skopiuj pliki do danego katalogu i w razie potrzeby go utwórz. Do kopiowania plików użyj modułu „shutil” Pythona.
$ ./copyspecial.py --todir /tmp/fooby . $ ls /tmp/fooby xyz__hello__.txt zz__something__.jpg
Część C (nawiązywanie połączenia z programem zewnętrznym)
Jeśli na początku wiersza poleceń znajduje się opcja „--tozip zipfile”, uruchom następujące polecenie: „zip -j zipfile <list all the files>”. Spowoduje to utworzenie pliku zip zawierającego te pliki. Dla rozrywki – dla rozrywki – też wydrukuj wiersz poleceń, które zamierzasz wykonać w pierwszej kolejności (jak pokazano na wykładzie). (Uwaga dla systemu Windows: w przypadku okien nie ma programu do tworzenia standardowych archiwów ZIP, ale możesz pobrać bezpłatny i otwarty program ZIP ze strony www.info-zip.org).
W przypadku systemu Linux, jeśli nie masz zainstalowanej aplikacji zip
, możesz ją zainstalować, wywołując 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
Jeśli proces podrzędny zakończy działanie z kodem błędu, zakończ działanie z kodem błędu i wydrukuj dane wyjściowe polecenia. Sprawdź to, próbując zapisać plik ZIP w katalogu, który nie istnieje.
$ ./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)