Przenieś wszystkie pliki CSV do jednego folderu (rekurencyjnie)

Zadanie 12 z 15 · rozdział 20Trudność: 2 z 3filesmovecsvrecursive

Treść zadania

Wczytaj ścieżkę folderu źródłowego i docelowego. Przenieś wszystkie pliki z rozszerzeniem .csv (bez względu na wielkość liter) z folderu źródłowego i wszystkich jego podfolderów bezpośrednio do folderu docelowego, zachowując ich nazwy.

  • Po przeniesieniu pliku nie ma już w starym miejscu. Foldery zostają, nawet jeśli staną się puste.
  • Jeśli folder docelowy nie istnieje, utwórz go (razem z brakującymi folderami nadrzędnymi). Gdy nie ma czego przenosić, nie ma znaczenia, czy go utworzysz.

Dane wejściowe

  • 1. linia: ścieżka folderu źródłowego
  • 2. linia: ścieżka folderu docelowego

Dane wyjściowe

  • Dawne ścieżki przeniesionych plików względem folderu źródłowego, każda w osobnej linii, posortowane rosnąco.
  • Brak plików. — jeśli nie ma żadnego pliku .csv.
  • Folder nie istnieje. — jeśli folder źródłowy nie istnieje. Wtedy niczego nie twórz.

Ograniczenia

  • Nazwy plików .csv w całym folderze źródłowym są różne, a w folderze docelowym nie ma plików o takich nazwach.
  • Folder docelowy nie leży wewnątrz folderu źródłowego.

Uwagi

  • Plik przenosi shutil.move(zrodlo, cel) albo Path.rename(cel).

Przykład

Pliki przed uruchomieniem
  • projekt/2023/q1/luty.CSV
    2,95
  • projekt/2023/styczeń.csv
    1,120
  • projekt/dane.csv
    id,wartość
    1,10
  • projekt/opis.txt
    Dane sprzedaży
Wejście
projekt
wyniki/csv
Wyjście
2023/q1/luty.CSV
2023/styczeń.csv
dane.csv
Pliki po uruchomieniu
  • projekt/2023/q1/luty.CSV(usunięty)
  • projekt/2023/styczeń.csv(usunięty)
  • projekt/dane.csv(usunięty)
  • projekt/opis.txt
    Dane sprzedaży
  • wyniki/csv/dane.csv
    id,wartość
    1,10
  • wyniki/csv/luty.CSV
    2,95
  • wyniki/csv/styczeń.csv
    1,120

Program utworzył folder wyniki/csv i przeniósł do niego trzy pliki; opis.txt został na miejscu.

Zasady obowiązujące w rozdziale 20

Poniższe zadania polegają na wczytywaniu danych ze standardowego wejścia (stdin), wykonywaniu operacji na plikach i folderach oraz wypisywaniu wyniku na standardowe wyjście (stdout).
Każde zadanie jest osobnym, niezależnym programem.

Konwencje wspólne:

  • Program działa na plikach w katalogu roboczym, czyli w folderze, w którym jest uruchamiany. Wszystkie ścieżki na wejściu są względne wobec katalogu roboczego i używają / jako separatora, np. dane/raport.txt. Ścieżki wczytuj jako całe linie — mogą zawierać spacje.
  • Sprawdzarka przed każdym testem tworzy nowy katalog roboczy z plikami opisanymi w teście, uruchamia program, a potem sprawdza zarówno wypisany tekst, jak i zawartość plików.
  • W przykładach Pliki przed: pokazuje zawartość katalogu roboczego przed uruchomieniem programu, a Pliki po: — stan wybranych plików po jego zakończeniu. Każda linia to ścieżka pliku, a linie zaczynające się od | to kolejne wiersze jego treści. Ścieżka zakończona / to pusty folder, (rozmiar: N B) oznacza plik o rozmiarze N bajtów, a (usunięty) — plik, którego po zakończeniu programu ma już nie być.
  • Pliki tekstowe są zapisane w kodowaniu UTF-8 — otwieraj je przez open(sciezka, encoding="utf-8").
  • Rozszerzenie to końcówka nazwy pliku od ostatniej kropki (razem z nią), np. archiwum.tar.gz ma rozszerzenie .gz. Rozszerzenia porównuj bez względu na wielkość liter (.TXT to też .txt).
  • Listy plików wypisuj po jednym w linii, jako ścieżki względem podanego folderu z separatorem / (np. 2024/raport.txt), posortowane rosnąco tak, jak sortuje napisy funkcja sorted(). Na Windowsie ścieżki mają separator \ — zamień go na / (np. metodą Path.as_posix()).
  • Komunikaty dla przypadków brzegowych wypisuj dokładnie w podanej postaci, np. Folder nie istnieje., Plik nie istnieje., Brak plików.
  • Program nie wypisuje komunikatów typu „Podaj ścieżkę:”. Tekst podany w input("…") jest ignorowany przez sprawdzarkę.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
dane
csv
Oczekiwane wyjście
2023/styczen.csv
2024/q1/luty.CSV
sprzedaz.csv
Pliki przed uruchomieniem
  • csv/(katalog)
  • dane/2023/opis.txt
    opis
  • dane/2023/styczen.csv
    1,2
  • dane/2024/q1/luty.CSV
    3,4
  • dane/sprzedaz.csv
    a,b
Pliki po uruchomieniu
  • csv/luty.CSV
    3,4
  • csv/opis.txt(usunięty)
  • csv/sprzedaz.csv
    a,b
  • csv/styczen.csv
    1,2
  • dane/2023/opis.txt
    opis
  • dane/2023/styczen.csv(usunięty)
  • dane/2024/q1/luty.CSV(usunięty)
  • dane/sprzedaz.csv(usunięty)

Test 2

Nie uruchomiono
Wejście
src
wyniki/csv
Oczekiwane wyjście
a.csv
b.csv
Pliki przed uruchomieniem
  • src/a.csv
    x
  • src/b.csv
    y
Pliki po uruchomieniu
  • src/a.csv(usunięty)
  • src/b.csv(usunięty)
  • wyniki/csv/a.csv
    x
  • wyniki/csv/b.csv
    y

Test 3

Nie uruchomiono
Wejście
src
dst
Oczekiwane wyjście
x/nowy.csv
Pliki przed uruchomieniem
  • dst/stary.csv
    s
  • src/x/nowy.csv
    n
Pliki po uruchomieniu
  • dst/nowy.csv
    n
  • dst/stary.csv
    s
  • src/x/nowy.csv(usunięty)

Test 4

Nie uruchomiono
Wejście
a
b
Oczekiwane wyjście
plik.csv
Pliki przed uruchomieniem
  • a/plik.csv
    1
  • b/plik2.csv
    2
Pliki po uruchomieniu
  • a/plik.csv(usunięty)
  • b/plik.csv
    1
  • b/plik2.csv
    2

Test 5

Nie uruchomiono
Wejście
dane
csv
Oczekiwane wyjście
Brak plików.
Pliki przed uruchomieniem
  • dane/a.txt
    x
  • dane/b.csv.bak
    y
  • dane/c.csv/plik.txt
    z
Pliki po uruchomieniu
  • csv/b.csv.bak(usunięty)
  • csv/c.csv/plik.txt(usunięty)
  • dane/a.txt
    x
  • dane/b.csv.bak
    y
  • dane/c.csv/plik.txt
    z

Test 6

Nie uruchomiono
Wejście
projekty
csv
Oczekiwane wyjście
Folder nie istnieje.
Pliki przed uruchomieniem
  • dane/a.csv
    x
Pliki po uruchomieniu
  • csv/a.csv(usunięty)
  • dane/a.csv
    x
Uruchom z własnymi danymi