Arbeiten mit Dateien / Verzeichnissen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo!
Ich dürfte nun bei meinem ersten simplen Vorhaben zumindest mal den ersten Schritt getan zu haben: Auswahl eines Laufwerkes + Einlesen der Verzeichnisse und Files auf diesem Laufwerk in eine Liste und Ausgabe.

Code: Alles auswählen

import os

def abfrage_laufwerk():    
    """Aufzulistendes Laufwerk auswaehlen"""
    laufwerk = input('Laufwerksbuchstabe: ')
    if ":" not in laufwerk:
         laufwerk = laufwerk + ":\\"
    return laufwerk

wahl_laufwerk = abfrage_laufwerk()
print ('Gewählt Laufwerk ' + wahl_laufwerk)
print ('='*19)

def verzeichnisse_einlesen():
    """Verzeichnisse des gewaehlten Laufwerks in Liste einlesen und ausgeben"""
    verzeichnisse = []
    wert = verzeichnisse.append(os.listdir(wahl_laufwerk))
    return verzeichnisse

anzeigen = verzeichnisse_einlesen()
print('Verzeichnisse / Dateien:')
print(anzeigen)
Folgendes habe ich noch vor:

1. "umschaufeln" der momentan als Einzellisteintrag vorhandenen Dateien/Verzeichnisse in eine Liste, in der jeder Eintrag einem Listelement entspricht
2. Auswahlmöglichkeit der Verzeichnisse mit Cursortasten + Return wählt aus und gibt den Inhalt des gewählten Verzeichnisses wieder
3. Möglichkeit eine Datei zu erstellen und Text hineinzuschreiben und zu speichern
4. Datei anzeigen

Fragen:
1. Kann man den Quelltext bislang so stehen lassen?
2. Unter Linux kommt meine Variante wohl nicht zu tragen, da es unter Linux ja keine Laufwerksbuchstaben gibt sondern nur in das Dateisystem "eingehängte" Devices.
Auch die Pfade werden nicht per \irgendwas angesprochen sondern /irgendwas.

Für Linux müsste ich das "Ding" also umschreiben, oder?

Etwas viel wahrscheinlich. Punkt 1 dürft ich eventuell noch hinbringen, bei den folgenden Punkten - vor allem Punkt 2. siehts im Moment noch dunkel aus :-)

LG
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

Also das erste was mir auffaellt, ist, dass du fuer deine Pfade vielleicht eher das os.path.abspath modul benutzen solltest anstatt von string concatenation. Das wurde mir auf jeden fall von den erfahrenen programmierern im forum mehrmals ans herz gelegt. Damit loest du auch das problem mit der verzeichnisabtrennung im pfad (windows \ und linux /). am besten doku dazu lesen.

Was frage 2 angeht, bin ich nicht mehr so in linux drinnen, aber wenn du die verzeichnisabfrage optional machst, je nach OS, geht das bestimmt auch in linux (das geht ja meist via /home/ oder sowas ohne laufwerkbuchstabe). Du kannst sys importieren und da gibt es eine moeglichkeit fuer dein skript zu testen, welches OS du benutzt (sys.platform?; schau am besten in der doku).

den letzten paragraph nur mit vorsicht geniessen und ausprobieren. evtl. auf eine qualifiziertere antwort warten.

Hope that helps.

Johannes
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Für das Zusammensetzen von Pfaden vor allem "join()". In Python 2.x "os.path.join", evtl. in 3.x direkt in "os"... meine mich daran zu erinnern; naja in der Doku stehts ja :-)

Evtl. bietet sich auch die os.walk() Funktion an, will man alle Verzeichnisse haben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@mdaniels: ``a = a + b`` kann man etwas kürzer schreiben als ``a += b``.

Bei `verzeichnisse_einlesen()` habe ich nicht so ganz verstanden was die Liste da soll. Überleg mal was `os.listdir()` zurückgibt. Der Docstring stimmt nicht ganz, denn es wird in der Funktion nichts ausgegeben.

`anzeigen` ist ein schlechter Name für eine Liste mit Dateinamen. Der Name klingt eher nach einer Funktion die etwas anzeigt.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Eure Responsezeit ist ein Wahnsinn :-)

Danke für die Tips!
@Hyperion: Ich glaube, es wird jetzt wieder ein wenig dauern, bis hier was neues von mir kommt. Muss erst "weiterstudieren" und mir dann überlegen wie ich das umsetze. :-)

@Blackjack:
os.listdir() gibt ja bereits eine Liste zurück :oops:
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Folgendes betreffend Inhalt der Liste nach Listindex ausgeben habe ich nun erstellt, wobei der Pfad momentan fix ist:

Code: Alles auswählen

def verzeichnisse_einlesen():
    """Verzeichnisse des gewaehlten Verzeichnisses einlesen"""
    verzeichnisse = os.listdir('/')
    return sorted(verzeichnisse)

anzeigen = verzeichnisse_einlesen()
print('Verzeichnisse / Dateien:')

elemente = len(anzeigen)
listen_zaehler = 0
print (anzeigen[0])
while True:
    navigieren = input('Liste durchgehen: n = nächster, v = vorheriger, g=gesamt:')
    if navigieren == "n" and listen_zaehler != elemente -1: #elemente - 1 da sonst anzeigen[] out of index läuft
        listen_zaehler += 1
        print (anzeigen[listen_zaehler])
 
        
    if navigieren == "v" and listen_zaehler != 0 and listen_zaehler <= elemente:
        listen_zaehler -= 1
        print (anzeigen[listen_zaehler])

    if navigieren == "g":
        for datensaetze in anzeigen:
            print (datensaetze)

Jetzt werd ich mir mal anschauen ob ich den Tip betreffend "Tasteneingabe abfangen" (anderer Thread von mir) umsetzen kann. Ich weiß, hier hab ich wieder globale Variablen und man könnte da mit Funktionen arbeiten. Werde das machen, sobald alles wie gewünscht funktioniert. :-)

LG
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

rein interessehalber.

wie kommst du aus dem while True: loop raus?

so wie ich das sehe wird der endlos laufen, oder irgendwann eine exception werfen oder habe ich da was uebersehen?
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo!
Zur Zeit läuft das endlos bis STRG + C ;-), du hast also recht.

edit mit x wird "while" verlassen:

Code: Alles auswählen

aussteigen = 0

while  aussteigen == 0:
    navigieren = input('Liste durchgehen: n = nächster, v = vorheriger, g = gesamt, x = exit:')
    if navigieren == "n" and listen_zaehler != elemente -1: #elemente - 1 da sonst anzeigen[] out of index läuft
        listen_zaehler += 1
        print (anzeigen[listen_zaehler])
 
    if navigieren == "v" and listen_zaehler != 0 and listen_zaehler <= elemente:
        listen_zaehler -= 1
        print (anzeigen[listen_zaehler])

    if navigieren == "g":
        for listen_eintraege in anzeigen:
            print (listen_eintraege)

    if navigieren == "x":
        aussteigen = 1
        exit
LG
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

elif existiert und dein exit wird auch nicht aufgerufen. Du möchtest außerdem lieber ein break verwenden um die Schleife zu verlassen.
Das Leben ist wie ein Tennisball.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

@EyDu:
Stimmt natürlich, das möchte ich :-)
Antworten