Liczba wierszy z obsługą błędów

Zadanie 15 z 15 · rozdział 20Trudność: 1 z 3filesexceptionstry/except

Treść zadania

Wczytaj k ścieżek. Dla każdej z nich wypisz w osobnej linii:

  • liczbę wierszy pliku — jeśli ścieżka wskazuje istniejący plik,
  • To jest folder: X — jeśli ścieżka wskazuje folder,
  • Brak pliku: X — jeśli pod ścieżką nic nie ma,

gdzie X to ścieżka dokładnie w takiej postaci, w jakiej ją wczytano.

Wiersze liczymy jak w str.splitlines(): pusty plik ma 0 wierszy, a znak nowej linii na końcu pliku nie tworzy dodatkowego wiersza.

Rozwiąż zadanie w stylu „najpierw spróbuj, potem obsłuż błąd”: otwórz plik w bloku try i przechwyć wyjątki zgłaszane przez open() (zob. Uwagi).

Dane wejściowe

  • 1. linia: k — liczba ścieżek
  • kolejne k linii: ścieżki

Dane wyjściowe

k linii — wynik dla każdej ścieżki, w kolejności wczytywania.

Ograniczenia

  • $1 \le k \le 20$
  • Żadna ścieżka nie prowadzi „przez” plik (np. notatki.txt/a).

Uwagi

  • Gdy coś pójdzie nie tak, open() zgłasza wyjątek: FileNotFoundError, gdy pliku nie ma, i IsADirectoryError, gdy ścieżka wskazuje folder (na Windowsie zamiast niego pojawia się PermissionError). Wyjątek przechwytuje blok try/except:
try:
    with open(sciezka, encoding="utf-8") as plik:
        tresc = plik.read()
except FileNotFoundError:
    print("Brak pliku:", sciezka)
  • W ZAD-01 najpierw sprawdzaliśmy, co jest pod ścieżką (os.path.isfile()), a dopiero potem działaliśmy — to styl LBYL („patrz, zanim skoczysz”). Tutaj od razu próbujemy otworzyć plik i obsługujemy ewentualny błąd — to styl EAFP („łatwiej prosić o wybaczenie niż o pozwolenie”), typowy dla Pythona. Jest odporny na sytuację, w której plik zniknie między sprawdzeniem a otwarciem.

Przykład

Pliki przed uruchomieniem
  • dane/(katalog)
  • notatki.txt
    kupić mleko
    zadzwonić do babci
Wejście
3
notatki.txt
dane
raport.txt
Wyjście
2
To jest folder: dane
Brak pliku: raport.txt
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
4
a.txt
b.txt
c.txt
d.txt
Oczekiwane wyjście
3
0
1
2
Pliki przed uruchomieniem
  • a.txt
    jeden
    dwa
    trzy
  • b.txt(pusty plik)
  • c.txt
    bez nowej linii
  • d.txt(pusty plik)

Test 2

Nie uruchomiono
Wejście
4
logi
logi/2024
logi/2024/styczen.log
logi/2023/grudzien.log
Oczekiwane wyjście
To jest folder: logi
To jest folder: logi/2024
2
Brak pliku: logi/2023/grudzien.log
Pliki przed uruchomieniem
  • logi/2024/luty.log
    z
  • logi/2024/styczen.log
    x
    y

Test 3

Nie uruchomiono
Wejście
2
moje notatki/lista zakupów.txt
moje notatki/lista.txt
Oczekiwane wyjście
4
Brak pliku: moje notatki/lista.txt
Pliki przed uruchomieniem
  • moje notatki/lista zakupów.txt
    mleko
    chleb
    
    masło

Test 4

Nie uruchomiono
Wejście
3
raport.txt
raport.txt
raport
Oczekiwane wyjście
2
2
Brak pliku: raport
Pliki przed uruchomieniem
  • raport.txt
    a
    b

Test 5

Nie uruchomiono
Wejście
2
puste
puste/nic.txt
Oczekiwane wyjście
To jest folder: puste
Brak pliku: puste/nic.txt
Pliki przed uruchomieniem
  • puste/(katalog)

Test 6

Nie uruchomiono
Wejście
1
.
Oczekiwane wyjście
To jest folder: .
Pliki przed uruchomieniem

(pusty katalog)

Uruchom z własnymi danymi