Liczba wierszy z obsługą błędów
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
klinii: ś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, iIsADirectoryError, gdy ścieżka wskazuje folder (na Windowsie zamiast niego pojawia sięPermissionError). Wyjątek przechwytuje bloktry/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
dane/notatki.txtkupić mleko zadzwonić do babci
3 notatki.txt dane raport.txt
2 To jest folder: dane Brak pliku: raport.txt
Potrzebujesz teorii?
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.gzma rozszerzenie.gz. Rozszerzenia porównuj bez względu na wielkość liter (.TXTto 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 funkcjasorted(). 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.
Przywrócono Twój zapisany kod.
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 uruchomiono4 a.txt b.txt c.txt d.txt
3 0 1 2
a.txtjeden dwa trzy
b.txtc.txtbez nowej linii
d.txt
Test 2
Nie uruchomiono4 logi logi/2024 logi/2024/styczen.log logi/2023/grudzien.log
To jest folder: logi To jest folder: logi/2024 2 Brak pliku: logi/2023/grudzien.log
logi/2024/luty.logz
logi/2024/styczen.logx y
Test 3
Nie uruchomiono2 moje notatki/lista zakupów.txt moje notatki/lista.txt
4 Brak pliku: moje notatki/lista.txt
moje notatki/lista zakupów.txtmleko chleb masło
Test 4
Nie uruchomiono3 raport.txt raport.txt raport
2 2 Brak pliku: raport
raport.txta b
Test 5
Nie uruchomiono2 puste puste/nic.txt
To jest folder: puste Brak pliku: puste/nic.txt
puste/
Test 6
Nie uruchomiono1 .
To jest folder: .
(pusty katalog)