Modyfikacja plików spełniających warunek (rekurencyjnie)

Zadanie 8 z 15 · rozdział 20Trudność: 2 z 3filesrecursivetxtcsv

Treść zadania

Wczytaj ścieżkę folderu i inicjały (np. A.D.). W tym folderze i wszystkich jego podfolderach:

a) do każdego pliku .txt dopisz inicjały jako nowy, ostatni wiersz,

b) z każdego pliku .csv usuń środkowy wiersz — gdy liczba wierszy jest parzysta, usuń dolny z dwóch środkowych.

Pozostałych plików nie zmieniaj. Na koniec wypisz ścieżki wszystkich zmienionych plików.

Szczegóły:

  • Wiersze liczymy jak w str.splitlines(): znak nowej linii na końcu pliku nie tworzy dodatkowego, pustego wiersza.
  • Inicjały trafiają bezpośrednio pod dotychczasowy ostatni wiersz, bez pustego wiersza pomiędzy — także wtedy, gdy plik nie kończy się znakiem nowej linii. Pusty plik .txt po zmianie zawiera tylko inicjały.
  • W pliku .csv o $n$ wierszach usuwamy wiersz numer $\lfloor n/2 \rfloor + 1$ (licząc od 1): przy 3 wierszach — 2., przy 4 — 3., przy 1 — jedyny wiersz.

Dane wejściowe

  • 1. linia: ścieżka folderu
  • 2. linia: inicjały

Dane wyjściowe

  • Ścieżki zmienionych plików względem podanego folderu, każda w osobnej linii, posortowane rosnąco.
  • Brak plików. — jeśli nie ma żadnego pliku .txt ani .csv.
  • Folder nie istnieje. — jeśli podana ścieżka nie wskazuje istniejącego folderu.

Ograniczenia

  • Każdy plik .csv ma co najmniej jeden wiersz.

Uwagi

  • Najpierw zbierz listę wszystkich plików (np. sorted(Path(folder).rglob("*"))), a dopiero potem je zmieniaj.

Przykład

Pliki przed uruchomieniem
  • projekt/2024/raport.txt
    Raport roczny
  • projekt/2024/wyniki.csv
    x,1
    y,2
    z,3
    w,4
  • projekt/dane.csv
    a,1
    b,2
    c,3
  • projekt/main.py
    print("Projekt X")
  • projekt/opis.txt
    Projekt X
Wejście
projekt
A.D.
Wyjście
2024/raport.txt
2024/wyniki.csv
dane.csv
opis.txt
Pliki po uruchomieniu
  • projekt/2024/raport.txt
    Raport roczny
    A.D.
  • projekt/2024/wyniki.csv
    x,1
    y,2
    w,4
  • projekt/dane.csv
    a,1
    c,3
  • projekt/main.py
    print("Projekt X")
  • projekt/opis.txt
    Projekt X
    A.D.

dane.csv ma 3 wiersze, więc traci 2. wiersz; wyniki.csv ma 4 wiersze, więc traci 3. wiersz. Plik main.py się nie zmienia.

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
praca
J.K.
Oczekiwane wyjście
dane.csv
opis.txt
rozdzial1/tabela.csv
rozdzial1/tekst.txt
Pliki przed uruchomieniem
  • praca/dane.csv
    id,wynik
    1,10
    2,20
  • praca/opis.txt
    Opis pracy
  • praca/rozdzial1/tabela.csv
    a
    b
    c
    d
    e
    f
  • praca/rozdzial1/tekst.txt
    Wstęp
    Treść
  • praca/skrypt.py
    print(1)
Pliki po uruchomieniu
  • praca/dane.csv
    id,wynik
    2,20
  • praca/opis.txt
    Opis pracy
    J.K.
  • praca/rozdzial1/tabela.csv
    a
    b
    c
    e
    f
  • praca/rozdzial1/tekst.txt
    Wstęp
    Treść
    J.K.
  • praca/skrypt.py
    print(1)

Test 2

Nie uruchomiono
Wejście
f
X
Oczekiwane wyjście
dwa.csv
jeden.csv
pusty.txt
Pliki przed uruchomieniem
  • f/dwa.csv
    pierwszy
    drugi
  • f/jeden.csv
    tylko,ten
  • f/pusty.txt(pusty plik)
Pliki po uruchomieniu
  • f/dwa.csv
    pierwszy
  • f/jeden.csv(pusty plik)
  • f/pusty.txt
    X

Test 3

Nie uruchomiono
Wejście
dok
A.N.
Oczekiwane wyjście
RAPORT.TXT
dane.CSV
Pliki przed uruchomieniem
  • dok/RAPORT.TXT
    Raport
  • dok/arkusz.xlsx
    bin
  • dok/dane.CSV
    1
    2
    3
    4
    5
  • dok/notatki.txt.bak
    kopia
Pliki po uruchomieniu
  • dok/RAPORT.TXT
    Raport
    A.N.
  • dok/arkusz.xlsx
    bin
  • dok/dane.CSV
    1
    2
    4
    5
  • dok/notatki.txt.bak
    kopia

Test 4

Nie uruchomiono
Wejście
w
Z.Z.
Oczekiwane wyjście
y.txt
Pliki przed uruchomieniem
  • w/y.txt
    w środku
  • x.txt
    poza
Pliki po uruchomieniu
  • w/y.txt
    w środku
    Z.Z.
  • x.txt
    poza

Test 5

Nie uruchomiono
Wejście
kod
A.D.
Oczekiwane wyjście
Brak plików.
Pliki przed uruchomieniem
  • kod/lib/util.py
    y
  • kod/main.py
    x
Pliki po uruchomieniu
  • kod/lib/util.py
    y
  • kod/main.py
    x

Test 6

Nie uruchomiono
Wejście
projekty
A.D.
Oczekiwane wyjście
Folder nie istnieje.
Pliki przed uruchomieniem
  • projekt/a.txt
    a
Pliki po uruchomieniu
  • projekt/a.txt
    a
Uruchom z własnymi danymi