Review? Absolute Pfade sollen ausgelesen und nach Bedarf in csv gepsiechert werden

Code-Stücke können hier veröffentlicht werden.
Antworten
fabian0
User
Beiträge: 7
Registriert: Dienstag 18. September 2018, 18:52
Wohnort: 127.0.0.1

Hallo Community,

ich weiß gar nicht genau ob es hier einen Review-Bereich gibt deswegen poste ich meinen Code hier mit der bitte um konstruktive Kritik.

Ich bin noch sehr weit am Anfang und fange an python in meinen Arbeitsalltag zu integrieren und habe durch meine mangelnde Erfahrung doch ein wenig "Angst" etwas falsch zu machen.

Mit dem folgenden Code möchte ich folgendes Problem lösen:

Ich mache regelmäßig eine Datensicherung und bekomme die Rückmeldung das x Dateien einen zu langen Pfad haben und deswegen nicht von dem Server auf eine über USB angeschlossene Festplatte kopiert werden können.
Der Code soll jede Datei in jedem Ordner (inkl. Unterordner) durchgehen und sich den absoluten Pfad jeder einzelnen Datei angucken.
Wenn der Pfad größer als z.B. 250 Zeichen lang ist soll dieser Pfad in eine csv Datei ausgegeben werden damit ich mit angucken kann um welche Dateien es geht.

WICHTIG: Das absolut wichtigste ist das kein Inhalt oder Namen der Datei verändert wird!
Wenn ihr euch den Code anguckt bitte hier besonders ein Augenmerk drauf legen.
Alles muss unverändert bleiben.

Ich freu mich über Rückmeldung.

Vielen Dank und beste Grüße

Code: Alles auswählen


import os

path = 'C:\\Users\\Fabian\Desktop\\testordner'

files = []
# r=root, d=directories, f = files
for r, d, f in os.walk(path):		
    for file in f:
        if len(os.path.abspath(file)) > 100:
            files.append(os.path.join(r, file))


file = open('C:\\Users\\Fabian\\Desktop\\zu_lange_namen.csv', 'w')


for zu_lang in files:
    file.write(zu_lang + '\n')


file.close()



Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@fabian0: Du mußt doch selbst wissen, dass das Programm nicht funktioniert, einfach, indem Du es einmal startest. Die Datei dürfte mit großer Wahrscheinlichkeit leer bleiben.

Wenn Du einen Kommentar brauchst, um zu beschreiben, was Deine Variablennamen bedeuten, sollte es ziemlich klar sein, dass die Namen Schrott sind. abspath löst den aktuellen Pfad auf, nicht den, indem die Datei ist, die `walk` gerade gefunden hat.

Heutzutage würde man pathlib verwenden:

Code: Alles auswählen

from pathlib import Path
path = Path('C:/Users/Fabian/Desktop/testordner')
filenames = map(str, path.rglob('*'))
filenames = filter(lambda f: len(f) > 100, filenames)
with open('C:/Users/Fabian/Desktop/zu_lang.txt', 'w') as output:
    for filename in filenames:
        output.write(filename + '\n')
fabian0
User
Beiträge: 7
Registriert: Dienstag 18. September 2018, 18:52
Wohnort: 127.0.0.1

Danke für deine Antwort.

Also mein Code funktioniert wenn ich den ausführe, wollte aber gern wissen ob die Gefahr besteht das der etwas macht was er nicht soll (was er machen soll ist oben beschrieben).
Danke für deinen Code den werd ich mir angucken.
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fabian0: Dein Code funktioniert nicht wirklich. Da wird der Pfad nicht gespeichert, also weisst Du am Ende zwar die Dateinamen die zu lang sind, aber nicht *wo* die sich befinden. Und es werden auch nur Dateinamen geprüft: auch Ordnernamen können zu lang sein.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fabian0
User
Beiträge: 7
Registriert: Dienstag 18. September 2018, 18:52
Wohnort: 127.0.0.1

Hallo blackjack,

wie kommst du darauf das der Pfad nicht gespeichert wird?

Das hier ist der Output meiner csv exemplarisch:
C:\Users\Fabian\Desktop\testordner\unterordner\noch ein unterordner\Neuer Ordner\vfdregtrdfhtrhjtrhrtzutrztrzrtzrtzrtztrz\dhbdgtrfhbztrbztrbetrbzdtrbztrdbztr\das hier ist eine testrar ob der pfad genommen wird.rar
Es geht hier ja nicht nur um den Dateinamen sondern um den gesamten Pfad ab "C:" bis zum dem Ort wo die Datei liegt.

Oder verstehe ich euch nur nicht?

__blackjack__ hat geschrieben: Sonntag 7. April 2019, 13:22 @fabian0: Dein Code funktioniert nicht wirklich. Da wird der Pfad nicht gespeichert, also weisst Du am Ende zwar die Dateinamen die zu lang sind, aber nicht *wo* die sich befinden. Und es werden auch nur Dateinamen geprüft: auch Ordnernamen können zu lang sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fabian0: Okay, es war heute für mich noch zu früh. Aber die Länge von Ordnernamen prüfst Du tatsächlich nicht.

Oh, und Du hast da einfach nur eine Textdatei. Die CSV-Datei zu nennen, ist ein bisschen übertrieben, denn Du machst keine Anstalten da beispielsweise Trennzeichen oder Sonderzeichen wie Zeilenumbrüche entsprechend zu behandeln. Wenn also in einem Pfad selbst irgendwo ein Zeilenendezeichen vorkommt, ist Dein Dateiformat nicht mehr geeignet. Liesse sich leicht durch Verwendung des `csv`-Moduls beheben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@fabian0: wenn das bei einer Deiner Testdatei funktioniert hat, dann war das Zufall, denn wie ich schon geschrieben hatte, ist die Längenprüfung falsch.
fabian0
User
Beiträge: 7
Registriert: Dienstag 18. September 2018, 18:52
Wohnort: 127.0.0.1

Sirius3 hat geschrieben: Sonntag 7. April 2019, 14:58 @fabian0: wenn das bei einer Deiner Testdatei funktioniert hat, dann war das Zufall, denn wie ich schon geschrieben hatte, ist die Längenprüfung falsch.
Also ich habe viele Dateien in vielen Ordnern die immer weiter verschachtelt werden und immer längere Pfade haben und je nachdem auf welchen Wert ich meine Begrenzung der Längenabpfage setze habe ich auch unterschiedliche Ergebnisse.

Kannst du mir erklären warum mein Code falsch ist? Wenn ich deinen Code nehme habe ich auch Ordner aufgelistet und möchte aber nur Dateien aufgelistet haben. Ich lasse mir doch den absoluten Pfad der jeweiligen Datei zurückgeben und bestimme durch die len() Funktion die Anzahl der Zeichen im Pfad. Sollte dieser größer x sein wird er in die Liste übergeben.

Kann mir jemand den Fehler bitte genauer erklären?

Vielen Dank.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Du benutzt, `len(os.path.abspath(file))` was den Dateinamen an den aktuellen Pfad hängt und dessen Länge vergleicht. Es kann also nicht sein, dass tiefer verschachtelte Pfade irgendwann zu lange werden, weil deren Länge berücksichtigst Du gar nicht.

Wenn Du keine Pfade haben willst, mußt Du halt noch über path.isfile filtern.
fabian0
User
Beiträge: 7
Registriert: Dienstag 18. September 2018, 18:52
Wohnort: 127.0.0.1

Hmm...das verstehe ich leider nicht. Um alle Dateien zu prüfen nutze ich os.walk und die for Schleife um systematisch über alle Dateien in den Ordnern und subordnern zu gehen.


Aber danke für deine Mühe.
Sirius3 hat geschrieben: Sonntag 7. April 2019, 15:20 Du benutzt, `len(os.path.abspath(file))` was den Dateinamen an den aktuellen Pfad hängt und dessen Länge vergleicht. Es kann also nicht sein, dass tiefer verschachtelte Pfade irgendwann zu lange werden, weil deren Länge berücksichtigst Du gar nicht.

Wenn Du keine Pfade haben willst, mußt Du halt noch über path.isfile filtern.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Lass dir mal ausgeben, was file für einen Wert beinhaltet BEVOR du den mit os.abspath behandelst. Und dann setzt das mal ins Verhältnis zur Dokumentation von os.walk und os.abspath. Dann wird das hoffentlich klar, das du da Unfug berechnest.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch ein Hinweis: das Verständnis davon, was einen absoluten und einen relativen Pfad auszeichnet ist auch wichtig.
fabian0
User
Beiträge: 7
Registriert: Dienstag 18. September 2018, 18:52
Wohnort: 127.0.0.1

Werde ich machen.
Danke für die Hinweise.
Antworten