Zugriff auf andere Laufwerke als C:\

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
RominaMDS
User
Beiträge: 3
Registriert: Montag 17. Oktober 2016, 11:37

Hallo zusammen!

Ich habe jetzt die letzten drei Stunden damit verbracht hier in den Foren zu lesen, aber bin leider einfach nicht auf eine passende Lösung gestoßen, die bei mir funktioniert.

Ich habe folgendes Ziel. Ich habe eine Ordnerstruktur, in der ich auslesen möchte wie viele Dateien sich darin befinden. Der Grund ist dafür, dass ich keine Lust habe manuell jeden Order durchzugehen.
Das Zählen der Dateien ist eigentlich das kleine Problem, da ich sowas schon mal im Ansatz gemacht habe.

Mein Problem ist jetzt, dass ich versuche auf ein Betriebsnetzwerk zuzugreifen, dass nicht lokal gespeichert ist. Leider bin ich bis jetzt nicht erfolgreich :(. Kann mir jemand sagen ob das überhaupt möglich ist und wenn ja wie ?

Hier mein wahrscheinlich noch ziemlich schlechter Code:

import os

pdir = ('G:\TEAM\CoC_XXX\G&P\2 X&X\04 - X & X\048- Data collection')

len([0 for (_,_,dateien)in w for datei in dateien if datei.endswith('./n')])

Ich bin absoluter Anfänger und entschuldige mich deswegen schonmal wenn das was ich geschrieben habe totaler Schrott ist. :(

Liebe Grüße

Romina
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

RominaMDS hat geschrieben:pdir = ('G:\TEAM\CoC_XXX\G&P\2 X&X\04 - X & X\048- Data collection')
Du greifst nicht darauf zu, worauf du glaubst zuzugreifen. Ein Backslash dient in einem String als Escape-Zeichen. So wird zum Beispiel aus einem '\t' ein Tabulatorzeichen und aus einem '\n' das Zeichen für einen Zeilenumbruch. In Kombination mit Zahlen ergibst sich da noch ganz anders. Beispielsweise ist ein '\061' genau das gleiche wie '1'.

In deinem Fall hast du nun beispielsweise in dem String in deinem Code Kombinationen wie '\04'. Das wird bei Programmausführung ein einziges Zeichen, was du mit len('\04') leicht überprüfen kannst.

Um den eigentlichen Backslash zu erhalten musst du ihm das Escape-Zeichen - also sich selber - voranstellen. Die Definition sähe dann so aus (die überflüssigen Klammern habe ich mal weggelassen):

Code: Alles auswählen

pdir = 'G:\\TEAM\\CoC_XXX\\G&P\\2 X&X\\04 - X & X\\048- Data collection'
Du kannst einfach mal print('\\') verwenden und siehst dann, dass das Ergebnis tatsächlich nur ein einziger Backslash ist.

Alternativ kannst du auch einen Raw-String verwenden. Darin ist die Beseutung des Backslash als Escape-Zeichen aufgehoben.

Code: Alles auswählen

pdir = r'G:\TEAM\CoC_XXX\G&P\2 X&X\04 - X & X\048- Data collection'
Das führende r ist genauso wie die Anführungszeichen nicht Bestandteil des Strings selber, sondern nur Teil der Python-Syntax.

Die dritte Möglichkeit besteht darin, einfach normale Slashes zu verwenden. Das funktioniert ebenfalls.

Code: Alles auswählen

pdir = 'G:/TEAM/CoC_XXX/G&P/2 X&X/04 - X & X/048- Data collection'

Den Rest des Codes habe ich mir jetzt noch nicht angesehen.
RominaMDS
User
Beiträge: 3
Registriert: Montag 17. Oktober 2016, 11:37

Hi!

tausend Dank!
Das hat jetzt funktioniert. Es ist wirklich ärgerlich zu merken, dass mir noch zu viele Basics fehlen.

Nur um noch einmal sicher zu gehen, dass ich deine Ausführungen richtig verstanden habe ( ich will ja auch etwas lernen nicht nur abschreiben):

1. Ich habe den Backslash falsch verwendet, wodurch das Programm nicht in der Lage dazu war den Pfad richtig zu erkennen und somit auf das
Verzeichnis zuzugreifen.
2. Ein Backslash führt in der Kombination mit bestimmen Buchstaben dazu, dass bestimme Zeichen gesetzt werden ?
3.Wenn ich nach dem Backslash einen zweiten einfüge wird dieser erkannt und der Pfad kann befolgt werden
4. Das mit den Zahlen habe ich ehrlicher Weise nicht ganz verstanden. Wenn eine \061 eine 1 ergibt, liegt es daran, dass durch den Backslash die zwei darauf folgenden Ziffern nicht gelesen werden oder wandelt die Voraussetzung eines Backslash vor eine Ziffer diese generell in eine 1 um?
5. bei der Nutzung des r' wird die zuvor notwendige Escape Funktion quasi außer Kraft gesetzt

Du musst mir nicht zwingend antworten. Ich bin nur immer froh, wenn ich auch wirklich die Hintergründe verstehe. :)

Liebe Grüße und schon einmal tausend Dank!!!

Romina
BlackJack

@RominaMDS: '\061' ist eine '1' weil die Oktaltahl 061 dem Wert des des Zeichens '1' in der ASCII-Zeichentabelle entspricht: http://man7.org/linux/man-pages/man7/ascii.7.html
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Im Wesentlichen hast du alles korrekt erkannt. Der Knackpunkt ist die besondere Bedeutung des Backslash innerhalb von String-Literalen.

Zu der Sache "mit den Zahlen" hat BlackJack schon etwas erklärt. Schau vielleicht einfach mal in die Dokumentation zu String and Bytes literals. Da gibt es eine Liste mit den Escape-Sequenzen und ihrer jeweiligen Bedeutung. Ein 'é' kann man nämlich auch so schreiben: '\N{LATIN SMALL LETTER E WITH ACUTE}'. :mrgreen:
RominaMDS
User
Beiträge: 3
Registriert: Montag 17. Oktober 2016, 11:37

Hallo zusammen!

danke für die weiteren Ausführungen. Es gibt wohl noch so einiges, dass ich mir aneignen muss aber ich gebe nicht auf! :D

Ich habe noch einen Anschlag auf euch vor. An der Stelle komme ich wieder nicht weiter.

Wie am Anfang beschrieben möchte ich auslesen welche Dateien sich in den Ordner ( unterschiedliche Ebenen) befinden. Wir haben das ganze in der Vorlesung wie folgt gelöst:

len([0 for (_,_,dateien)in w for datei in dateien if datei.endswith('.tex')])

allerdings haben wir dabei direkt auf das C-Laufwerk zugegriffen und zuvor die walk('.') Funktion angewendet:

Import os

cd

walk('.')

w = [(path,verznisse,dateien) for path,verznisse,dateien in walk ('.') ]

und darauf hin die oben benannte Formulierung

Ich habe versucht das anzupassen und habe:


w = 'G:/TEAM/CoC_Procurement/G&P/2 P&O/04 - Analytics & Optimization/048- Data collection'

len([0 for (_,_,Items) in w for item in w if item.endswith("./n")])

---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-122-640f1c337988> in <module>()
----> 1 len([0 for (_,_,Items)in w for item in w if item.endswith(".pptx")])

<ipython-input-122-640f1c337988> in <listcomp>(.0)
----> 1 len([0 for (_,_,Items)in w for item in w if item.endswith(".pptx")])

ValueError: not enough values to unpack (expected 3, got 1)

Ich habe auch versucht die walk Funktion anzuwenden, aber diese bezieht sich immer wieder auf das C Laufwerk und nicht auf mein Ziellaufwerk. Als ich versucht habe zu definieren wo di Funktion "walk" zugreifen soll bin ich auch gescheiert, weil w als Str angesehen wird und damit keine walk/listdir oder was auch immer für Funktionen angewandt werden können.

Ich mache wahrscheinlich wieder irgendeinen dummen Fehler aber komme einfach nicht darauf.

Danke schonmal für eure tolle Hilfe und ich wünsche euch noch einen charmanten Abend!
BlackJack

@RominaMDS: Wenn ihr das in der Vorlesung so gelernt habt, dann vergiss am besten alles aus der Vorlesung und lauf schreiend weg.

Eine Liste mit 0en auf so undurchsichtige Weise zu erstellen, wobei die 0en noch nicht einmal interessieren, weil am Ende nur die Länge der Liste genommen wird ist ziemlich gruselig. Wenn Du zwei ``for``/``in`` in *einer* „list comprehension“ nicht durchschaust, dann lass das Konstrukt einfach sein. Wirklich sinnvoll ist das mit der Liste mit irgendwelchen Objekten die einen gar nicht interessieren sowieso nicht. Schreib das als Schleife, dann wird es auch verständlicher. Wenn Du unbedingt willst, kannst Du die Schleifen am Ende immer noch in einer kompatkere, aber unverständlichere Syntaxform überführen. Und dann auch eher in einen Geneatorausdruck der die Längen liefert und die mit `sum()` aufsummiert, statt der ganzen sinnlosen 0en oder anderer Platzhalterobjekte.

Die total falschen Namen helfen auch nicht beim Verständnis. `w`

Falls das `cd` in dem ”Quelltext” die `os.cd()`-Funktion sein soll: Von der lässt man auch besser die Finger. Das ändert einen globalen Zustand des Programms und hat Auswirkungen auf alle anderen Teile eines Programms die etwas mit relativen Pfaden machen.

Geh einen Schritt zurück und zerlege das Problem in Teilprobleme und die dann wieder in Teilprobleme, solange bis die jeweils so klein sind, dass man sie mit einer Funktion in wenigen Zeilen Code lösen kann. Dann setze diese Teillösungen zu grösseren Teillösungen zusammen, solange bis das Gesamtproblem gelöst ist. Dabei die jeweiligen Teillösungen immer Testen und erst mit etwas anderem fortfahren bis die aktuell entwickelte Teillösung funktioniert.

Am Ende kann man dann schauen ob nicht die eine oder andere Funktion so simpel und nicht eigentständig genug ist, dass man sie nicht vielleicht direkt in die aufrufende Funktion integrieren kann. Wenn man länger programmiert, dann sieht man so etwas schon beim implementieren, aber am Anfang lieber eine Funktion ”zu viel” als zu versuchen zu viel in einer Funktion zu lösen, oder wie bei dem Beispiel aus der Vorlesung sogar alles in einen Ausdruck pressen zu wollen.

Wobei die Änderung aus der Vorlesung zu dem was hier anscheinend gemacht werden soll, eigentlich minimal ist. Du schreibst ihr habt die `walk('.')`-Funktion verwendet. Nun das ist ja eigentlich die `os.walk()`-Funktion. Was bedeutet denn das Argument? Das wissen alleine sollte ausreichen, wenn man Powerpoint-Dateien zählen will und schon heraus gefunden hat, das man dazu '.tex' durch '.pptx' ersetzen muss, weil das Beispiel LaTeX-Quelltexte gezählt hat.
Antworten