Kapitel 14
Systemfunktionen
428
14.5 Lösungen
Lösung 1
Skript:
Beispieldialoge:
Erläuterung:
#1: Aus Vor- und Nachname wird ein Verzeichnisname konstruiert und mit der String-
Methode
lower() in einen String aus lauter Kleinbuchstaben überführt.
#2: Es wird versucht, ein Verzeichnis mit dem angegebenen Pfad anzulegen. Falls noch kein
Verzeichnis
/python/projekt/user/ existiert, wird auch dieses angelegt. Der Versuch
scheitert, wenn im Verzeichnis
/python/projekt/user/ bereits ein Unterverzeichnis mit
dem berechneten Namen vorhanden ist. In diesem Fall wird die
try-Klausel abgebrochen
und die
except-Klausel ausgeführt.
Lösung 2
Skript:
# verzeichnisanlegen.py
from os import makedirs
vorname = input('Vorname: ')
nachname = input('Nachname: ')
verzeichnisname = (vorname[:6]+nachname[:2]).lower() #1
try:
makedirs('/python/projekt/user/'+verzeichnisname) #2
print('Verzeichnis angelegt')
except:
print('Verzeichnis existiert bereits')
Vorname: Chris
Nachname: Keller
Verzeichnis angelegt
Vorname: Chris
Nachname: Keller
Verzeichnis existiert bereits
# robot.py
from os import walk
from os.path import join, normcase
SUCHBERICHT="""
Suchbericht
-----------
429
14.5
Lösungen
{}
Es wurden {} Dateien durchsucht.
{} Dateien waren nicht lesbar.
""" #1
class suchRobot(object):
def __init__(self, suchwort, wurzel):
self.ergebnis = []
self.suchwort = suchwort
self.wurzel = wurzel
self.nicht_lesbar = 0
self.durchsucht = 0
liste = walk(wurzel) #2
for pfad, verzeichnisse, dateien in liste:
for datei in dateien:
self.durchsucht += 1 #3
try:
f = open(join(pfad, datei), 'r') #4
text = f.read() #5
f.close()
n = text.count(suchwort) #6
if n > 0:
p = normcase(join(pfad, datei)) #7
self.ergebnis += [(n, p)] #8
except:
self.nicht_lesbar += 1
self.ergebnis.sort(reverse=True) #9
def __str__(self): #10
tabelle = ""
for (n, pfad) in self.ergebnis:
tabelle += '{} ({} Vorkommen )\n'.format(
pfad, n, self.suchwort)
return SUCHBERICHT.format(tabelle,
self.durchsucht,
self.nicht_lesbar)
# Hauptprogramm
suchwort = input("Suchwort: ")
wurzel = input("Wurzelverzeichnis: ")
bot = suchRobot(suchwort, wurzel)
print(bot)
Kapitel 14
Systemfunktionen
430
Erläuterung:
#1: Die globale Variable SUCHBERICHT enthält einen langen String mit drei Platzhaltern für
variable Teile..
#2: Hier entsteht eine Liste aus Tripeln der Form (pfad, unterverzeichnisse, dateien).
#3: Hier werden die durchsuchten Dateien gezählt.
#4: Die Datei wird zum Lesen (im Textmodus) geöffnet.
#5: Der Inhalt der Datei wird gelesen und als String der Variablen text zugeordnet. Dieser
Schritt kann misslingen, wenn die Datei eine Binärdatei ist und keinen Text repräsentiert.
Dann kann sie nämlich Bytefolgen enthalten, die nicht decodiert werden können. Deshalb
steht dieser Abschnitt in einer
try-Klausel.
#6: Hier wird festgestellt, wie oft das Suchwort im Text der Datei vorkommt.
#7: Der komplette Pfad der Datei wird aus dem Pfad des Verzeichnisses und dem Namen
der Datei zusammengesetzt.
#8: An die Ergebnisliste wird ein Paar (Anzahl Vorkommen, Pfadbezeichnung) angehängt.
#9: Die Liste wird absteigend sortiert. Da die erste Komponente der Paare die Anzahl der
Vorkommen des Suchbegriffs ist, wird nach diesem Kriterium sortiert.
#10: Hier wird der Suchbericht erzeugt. Es ist die textuelle Repräsentation des Objektes.
Lösung 3
Skript:
# dateisuche.py
from os import walk
from os.path import normcase, join, getmtime
from time import time, ctime
class Dateisucher:
def __init__(self, start, zeit):
self.durchlauf = walk(start) #1
self.ergebnis = []
zeitlimit = time() - zeit*3600 #2
for pfad, verzeichnisse, dateien in self.durchlauf:
for datei in dateien:
dateipfad = normcase(join(pfad, datei)) #3
if getmtime(dateipfad) > zeitlimit: #4
self.ergebnis.append(
(getmtime(dateipfad), dateipfad)) #5
def __str__(self):
bericht = 'Datei und Zeitpunkt der letzten Änderung:\n\n'
for zeit, pfad in self.ergebnis: #6
431
14.5
Lösungen
Erläuterung:
#1: Hier wird eine Folge von Tripeln der Form (pfad, verzeichnisse, dateien) berech-
net. Jedes Tripel beschreibt ein Unterverzeichnis des Verzeichnisbaums.
#2: Berechnung der Zeitgrenze in Sekunden seit Beginn der Epoche.
#3: Verzeichnis und Dateiname werden zu einem Pfad verbunden und dieser mit norm-
case()
in eine einheitliche Schreibweise gebracht.
#4: Wenn der Zeitpunkt der letzten Änderung der Datei über dem Zeitlimit liegt (also neuer
ist), ...
#5: ... dann wird an die Liste ergebnis ein neues Paar aus Änderungszeit und Pfad der Datei
gehängt.
#6: Aus der Liste ergebnis wird Zeile für Zeile ein String mit der gewünschten Tabe ll e auf-
gebaut.
bericht += '{} {} \n'.format(pfad,
ctime(zeit))
return bericht
#Hauptprogramm
start = input("Wurzel des Verzeichnisbaums: ")
zeit = int(input("Zeitraum (Stunden): "))
print(Dateisucher(start, zeit))

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.