Verzeichnis/Dateiliste als tex-Datei ausgeben

Du hast eine Idee für ein Projekt?
TuXX
User
Beiträge: 24
Registriert: Sonntag 25. Juni 2017, 17:52

Hallo Community,

für die Technische Dokumentation von Projekten will ich in einem Ordner und einer Ordnerstruktur darunter befindliche pdf Dateien (andere Dateitypen sollen ausgelassen werden!) in einer pdf-Datei mit Lesezeichen zusammenfassen.

Die Strutkur sieht z.B. so aus:

[codebox=text file=Unbenannt.txt]Stammordner
Verzeichnis 1 (Ebene 2)
11.pdf
12.pdf
13.pdf
Verzeichnis 2 (Ebene 2)
21.pdf
22.txt (nicht berücksichtigen, da kein pdf!)
01.pdf
02.pdf[/code]

Die Verzeichnisstruktur und Dateistruktur soll eingelesen werden und entsprechende Bookmarkeinträge und pdfincludes sollen in eine tex-Datei geschrieben werden. Sowohl die Einträge der Verzeichnisse auf Ebene 2, als auch die Einträge für die pdf-Dateien sollen alphabetisch sortiert integriert werden. Der Text-Code für die pdfincludes und die Bookmarkeinträge habe ich schon erstellt.

Da der Rest der Dokumentation auch in Tex erstellt wird, möchte ich diesen Teil auch in Tex erstellen. Allerdings möchte ich den oben beschriebenen Teil automatisieren.

Hat jemand von euch schon einmal etwas ähnliches realisiert. Jegliche Ideen werden gerne entgegen genommen, da ich gerade erst mit Python begonnen habe und noch nicht wirklich durchblicke.

Vielen Dank im Voraus für eure Hilfe!
Zuletzt geändert von Anonymous am Sonntag 25. Juni 2017, 18:47, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
BlackJack

@TuXX: `os.walk()` solltest Du Dir ansehen. Und dann bräuchtest Du irgendwas um LaTeX zu generieren. Also mindestens mal eine Funktion die Sonderzeichen für LaTeX „escaped“. Und vielleicht eine Template-Bibliothek wie Jinja2. Oder etwas was schon speziell auf LaTeX ausgerichtet ist wie `PyLaTeX`. Oder eine Kombination davon.
TuXX
User
Beiträge: 24
Registriert: Sonntag 25. Juni 2017, 17:52

Mittlerweile habe ich wenigstens schon einmal den Code für das Auslesen der Ordner und Dateien einer Verzeichnisstruktur gefunden:

Code: Alles auswählen

import os
for folderName, subfolders, filenames in os.walk('C:\\Techdok\\'):
    print('The current folder is:' + folderName)

    for subfolder in subfolders:
        print('Subfolder of' + folderName + ': ' + subfolder)
    for filename in filenames:
        print('File inside' + folderName + ': '+ filename)
    print('')
Daraus ergeben sich wieder eine Reihe von Fragen:

- Wie kann ich z.B. das .pdf bei filename abschneiden oder das C:\ vor dem folderName?
- Wie kann ich die ausgelesenen Werte sortieren (subfolder/Filname)?
- Wie kann ich diese Informationen in eine txt-Datei schreiben?
- Wie kann ich nur pdf-Dateien berücksichtigen?
Zuletzt geändert von Anonymous am Sonntag 25. Juni 2017, 21:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@TuXX: Für die Manipulation von Pfaden gibt es im `os.path`-Modul eine ganze Menge Funktionen.

Sortieren geht mit der `sort()`-Methode auf Listen oder der `sorted()`-Funktion wenn man keine Liste, sondern ein anderes iterierbares Objekt hat, oder eine sortierte (flache) Kopie einer Liste haben möchte.

Grundlegender Umgang mit Dateien sollte im Tutorial in der Python-Dokumentation erwähnt sein.
TuXX
User
Beiträge: 24
Registriert: Sonntag 25. Juni 2017, 17:52

Mittlerweile habe ich versucht die Bildschirmausgabe des Verzeichnisses in eine Datei zu schreiben. Allerdings funktioniert das mit dem folgenden Code nicht so wirklich:

Code: Alles auswählen

import os
datafile = open('dirstructure.txt','w')
for folderName, subfolders, filenames in os.walk('C:\\Techdok\\'):
    datafile.write('Verzeichnisname:'+ folderName)
    datafile.close()
Kennt hier jemand Rat?

Danke im Voraus!
Zuletzt geändert von Anonymous am Montag 26. Juni 2017, 11:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@TuXX: was heißt hier „nicht so wirklich“? Das Programm macht genau das, was Du sagst. Wenn Du etwas anderes willst, mußt Du es auch programmieren. Du kommst nicht drumrum, die Grundlagen von Python, und von Programmierung im allgemeinen, zu lernen. Die Bereitschaft, dass hier irgendjemand für Dich programmiert, in dem Du bei jeder Zeile nachfragst, dürfte sehr gering sein.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

TuXX hat geschrieben:Daraus ergeben sich wieder eine Reihe von Fragen:

- Wie kann ich z.B. das .pdf bei filename abschneiden oder das C:\ vor dem folderName?
- Wie kann ich die ausgelesenen Werte sortieren (subfolder/Filname)?
- Wie kann ich diese Informationen in eine txt-Datei schreiben?
- Wie kann ich nur pdf-Dateien berücksichtigen?
Die Frage ist aber auch, wie viele von Deinen Fragen Du mit einen Blick in einem Buch oder Tutorials selbst lösen könntest. Wie man *.txt Dateien zum Lesen öffnet oder etwas in diesen speichert, steht in jedem Buch für Einsteiger.
Zu den restlichen Fragen habe ich ein Test-Script mittlerweilen zu liegen, damit könntest Du weiter experimentieren.
So viel brauchst Du nicht ausgeben. Das C verschwindet bereits, wenn Du das Script aus dem zu durchsuchenden Verzeichnis startest und es da auch ablegst, weil dann ein "." genügt.

Ansetzen muss man alle 3 für (dirpath, dirnames, filenames) im Schleifenkopf, da ein 3er Tupel erwartet wird, doch zum Auswerten genügen os.path.join(dirpath, name), falls ich es richtig verstanden haben sollte und mein Test-Script läuft zumindest.

https://docs.python.org/3/library/os.html

Dann so, dass nur Dateien mit einer oder mehreren ausgewählten Endungen in die Liste aufgenommen werden. Die Funktion würde ich im Groben so belassen wie sie ist und nur den Rest anpassen, je nachdem wie das Ergebnis weiter verarbeitet werden soll.

Code: Alles auswählen

import os

def suche_files(durchlaufe, endung):
    fileliste = []

    for verzeichnisse, unterordner, dateien in os.walk(durchlaufe):
        for dateinamen in dateien:
            extension = dateinamen.split(".")[1:]
            if extension[0] == endung:   
                fuelleliste = os.path.join(verzeichnisse, dateinamen)
                fileliste.append(fuelleliste)

    return fileliste

endung = "pdf"
ergebnis = suche_files(".", endung)

for dateien in ergebnis:
    print(dateien)
BlackJack

@Melewo: Dateinamen an '.' zu splitten um an die Endung zu kommen funktioniert nicht wenn mehr als ein Punkt im Dateinamen/-pfad vorkommen. Es gibt `os.path.splitext()` für so etwas.

Ich würde mir für die gegebene Aufgabenstellung wahrscheinlich selber eine rekursive `walk()`-Funktion schreiben, denn das Ergebnis soll ja eine verschachtelte Auflistung werden. Da muss man wissen auf welcher Ebene man sich gerade befindet. Kann man zwar alles nachträglich aus den Pfaden wieder ermitteln, aber warum so umständlich.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

So, nun habe ich os.path.splitext verwendet.

Code: Alles auswählen

import os

def suche_files(durchlaufe, endung):
    fileliste = []

    for verzeichnisse, unterordner, dateien in os.walk(durchlaufe):
        for dateinamen in dateien:
            extension = os.path.splitext(dateinamen)[1]
            if extension == endung:   
                fuelleliste = os.path.join(verzeichnisse, dateinamen)
                fileliste.append(fuelleliste)

    return fileliste

endung = ".pdf"
ergebnis = suche_files(".", endung)

for dateien in ergebnis:
    print(dateien)
Wenn ich das Ergebnis mit dem Ergebnis meiner rekursiven PHP-Funktionen vergleiche, dann arbeitet die doch eigentlich bereits wie eine rekursive Funktion, da doch die Unterverzeichnisse mit durchlaufen werden.

Ein Beispiel aus der Liste:

.\Lebenszeit\Archiv-Zeit-Dokumente\PDFs\Age-effects-in-perception-of-time.pdf

Wichtig ist ja erst einmal eine Liste zu erhalten und in der zweiten Funktion überlege ich mir bei jedem Script, was machen mit der Liste. Mit einem zusätzlichen DB-Query eine XML-Sitemap erstellen oder die Dateien zum Durchsuchen öffnen.
BlackJack

@Melewo: Es werden alle Verzeichnisse durchlaufen aber beim Verwenden der Funktion bekommt man nicht mit auf welcher Ebene man sich befindet. Ich ging davon aus das man keine flache Liste braucht, sondern die Struktur der Verzeichnisse erhalten bleiben muss.

Aber so ganz klar ist mir die Aufgabenstellung dabei nicht. Falls eine rekursive Datenstruktur benötigt wird, fände ich es jedenfalls einfacher die gleich mit einer rekursiven Funktion zu erstellen, also später die flache Liste mit den Pfaden zu verarbeiten.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

@BlackJack: Die Listen sehen geordnet aus, die Verzeichnisse werden in alphabetischer Reihenfolge durchlaufen. So wie von TuXX im ersten Beispiel aufgeführt, würde ich es für meinen Bedarf nicht gruppieren, dadurch würde ja ein Unterverzeichnis mit 22 Dokumenten in 20 und 2 zerrissen. Gut, da muss jeder wissen, was erreicht werden soll. Stimmt schon, das sollte eigentlich kein unlösbares Problem sein, ähnliches bereits in der ersten Funktion mit zu erreichen.
BlackJack

@Melewo: Da sprichst Du noch einen anderen Punkt an: das sortieren. Das muss man noch selbst machen! Auch wenn das bei Dir vielleicht so aussieht als wäre das schon sortiert, gibt es dafür keine Garantie in welcher Reihenfolge die Namen vom System kommen.

Was Du mit „mit 22 Dokumenten in 20 und 2 zerrissen“ meinst verstehe ich nicht. Ich ging davon aus, dass das Dokument am Ende die Verzeichnisstruktur wiederspiegeln soll. Und dazu braucht man die Verzeichnisstruktur und keine flache Liste. Also als JSON-Dokument ausgedrückt beispielsweise so etwas:
[codebox=javascript file=Unbenannt.js]{
".": {
"Stammordner": {
"Verzeichnis 1": {
"11.pdf": null,
"12.pdf": null,
"13.pdf": null
},
"Verzeichnis 2": {
"21.pdf": null
}
}
},
"01.pdf": null,
"02.pdf": null
}[/code]
Wobei ich mir hier jetzt auch nicht ganz sicher bin ob die beiden 01.pdf und 02.pdf tatsächlich ausserhalb vom Stammordner liegen, wie das Beispiel aus dem ersten Beitrag suggeriert.

Und vielleicht gibt es ja auch nur diese 2 bis 3 Ebenen, da könnte man letztlich auch expliziten Code für schreiben. Insbesondere wenn für die drei (oder zwei) Ebenen jeweils eher spezielle Sachen gemacht werden müssen beim Umwandeln in ein LaTeX-Dokument oder -Fragment.

Letztlich müsste TuXX da etwas zu sagen wie die Struktur des Ergebnisses aussehen muss/soll.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

@BlackJack: Das mit der 20 und 2 war wohl wieder einmal mein gedanklicher Fehler, weil Verzeichnis 2 mit 21.pdf begann. Bei mir liegen zumindest die PDF-Dokumente in Ordnern, deren Namen die Themenzugehörigkeit erkennen lassen. Das mit 01.pdf und 02.pdf, ich nehme an, die liegen innerhalb von 'C:\Techdok\', wurden halt nur nicht in Unterordnern von Techdok einsortiert.

Kenne jetzt sicherlich viele Möglichkeiten noch nicht und anderes wird halt davon abhängig sein, was erreicht werden soll. Habe mir heute nur python-docx kurz angesehen und auf spätere Zeiten verschoben, um mich nicht zu sehr zu verzetteln. Was ich für meinen Teil noch testen möchte, geht vorläufig mehr in die Richtung os.path.getmtime(path) oder os.path.getatime(path), um Dokumente nach zeitlichen Vorgaben zu sortieren.
TuXX
User
Beiträge: 24
Registriert: Sonntag 25. Juni 2017, 17:52

Als Erstes ein grosses Dankeschön an alle die sich an der konstruktiven Lösung des Problems beteiligen.

Hier noch einmal eine bessere Erklärung der Ordnerstruktur:

Code: Alles auswählen

Stammordner (Techdok) (Ebene 0)
   Verzeichnis 1 (Ebene 1)
      Datei11.pdf (Ebene 2)
      Datei12.pdf (Ebene 2)
   Verzeichnis 2 (Ebene 1)
      Datei21.pdf (Ebene 2)
      Datei22.pdf (Ebene 2)
   Datei01.pdf (Ebene 1)
   Datei02.pdf (Ebene 2)
Aus dieser Struktur ergibt sich auch die spätere Lesezeichen-Struktur des Dokuments.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Die Frage wäre dabei letztendlich, wie weit Du bereits gekommen bist. Ich meine, es entspricht ja in etwa dem, wofür BlackJack bereits Tipps gab und letztendlich bis Du der Programmierer, der etwas entwickeln möchte.

Bei mir fängt es ähnlich an mit dem Durchlaufen von Verzeichnissen, biegt dann aber in eine andere Richtung, weil ich mich oftmals in etwa an einen zeitlichen Rahmen erinnern kann, nur nicht mehr unbedingt daran, wo ich eine Datei vor Monaten oder länger ablegt. Oder bin mir sicher, dass ich bereits einmal ein Testscript mit dieser oder jener Funktion geschrieben habe und muss dann erst Stunden suchen. Für PHP hatte ich mir dafür so eine "Suche im Quelltext" geschrieben, die läuft aber nur innerhalb von htdocs, mit Python ist diese Beschränkung nicht gegeben.

Den Anfang habe ich nun erst einmal fertig, wie man eine vorzugebende Endung auswählt und anderes wird ja daraus ersichtlich, auch wenn der Rest dann nicht mehr Deinem geplanten Projekt entspricht und BlackJack oder Sirius3 noch genug finden würden, was sie besser gemacht hätten.

Bild

Code: Alles auswählen

from tkinter import Tk, Frame, Label, Button, Text, Scrollbar, Radiobutton, Entry, StringVar, END
import os
import time

def wandle_datum(data):
    return int(time.mktime(time.strptime(data, "%d.%m.%Y")))

def suche_files(durchlaufe, auswahl, endung, vondate, bisdate):
    os.stat_float_times(False)
    file_dict = {}
    rueckgabe = []

    for verzeichnisse, unterordner, dateien in os.walk(durchlaufe):
        for dateinamen in dateien:
            extension = os.path.splitext(dateinamen)[1]
            if extension == endung:
                if auswahl == "alphabetisch":
                    zeitpunkt = os.path.getctime(os.path.join(verzeichnisse, dateinamen))
                    fuelledict = {os.path.join(verzeichnisse, dateinamen) : zeitpunkt}
                    file_dict.update(fuelledict)

                if auswahl == "angelegt":
                    zeitpunkt = os.path.getctime(os.path.join(verzeichnisse, dateinamen))
                if auswahl == "aenderung":
                    zeitpunkt = os.path.getmtime(os.path.join(verzeichnisse, dateinamen))
                if auswahl == "aufgerufen":
                    zeitpunkt = os.path.getatime(os.path.join(verzeichnisse, dateinamen))

                if auswahl == "angelegt" or auswahl == "aenderung" or auswahl == "aufgerufen":
                    if vondate is None or bisdate is None:
                        fuelledict = {zeitpunkt : os.path.join(verzeichnisse, dateinamen)}
                        file_dict.update(fuelledict)
                    if vondate is not None and bisdate is not None:
                        if zeitpunkt >= wandle_datum(vondate) and zeitpunkt <= wandle_datum(bisdate):
                            fuelledict = {zeitpunkt : os.path.join(verzeichnisse, dateinamen)}
                            file_dict.update(fuelledict)

    sortiert = sorted(file_dict.items())

    if auswahl == "alphabetisch":
        for files, filetimes in sortiert:
            zeitformat = time.strftime("%d.%m.%Y", time.localtime(filetimes))
            rueckgabe.append("{0:s} - {1:s}".format(files, zeitformat))

    if auswahl == "angelegt" or auswahl == "aenderung" or auswahl == "aufgerufen":
        for filetimes, files in sortiert:
            zeitformat = time.strftime("%d.%m.%Y", time.localtime(filetimes))
            rueckgabe.append("{0:s} - {1:s}".format(files, zeitformat))

    return rueckgabe

class Dateisuche:

    def __init__(self):
        self.fenster = Tk()
        self.set_auswahl = StringVar(value="1")
        self.set_endung  = StringVar(value="1")
        self.textfeld = None
        self.auswahl = "alphabetisch"
        self.endung  = "py"
        self.vondate = None
        self.bisdate = None
        self.durchlaufe = "."

    def main(self):
         gefunden = suche_files(self.durchlaufe, self.auswahl,
                    self.endung, self.vondate, self.bisdate)

         self.textfeld.delete(1.0, END)

         for dateien in gefunden:
             self.textfeld.insert(1.0, "{}\n".format(dateien))

    def layout(self):
        self.fenster.title("Dateisuche")
        self.fenster.geometry("920x620")
        self.fenster["bg"] = "#808080"

        frame_li = Frame(self.fenster, bg = "#808080", padx = 2)
        frame_re = Frame(self.fenster, bg = "#6f6352", padx = 2)

        # Linker Frame
        self.textfeld = Text(frame_li, width = 92, height = 38)
        scrollbr = Scrollbar(frame_li)
        scrollbr.config(command = self.textfeld.yview)
        self.textfeld.config(yscrollcommand = scrollbr.set)

        frame_li.pack(side = "left")
        scrollbr.pack(side = "right", fill = "y")
        self.textfeld.pack(pady = 0, padx = 2)

        # Rechter Frame
        frame_re.pack(side = "right", fill = "y")
        Label(frame_re, text = "Auswahl Sortierung", bg = "#6f6352",
              font = ("cambria", 11), fg = "#ffe9b3",
              justify = "left").pack(padx =10, pady = 12, anchor = "w")
        drei_buttons = {
            "Alphabetisch" : "alphabetisch",
            "Datei angelegt"  : "angelegt",
            "Letzte Änderung" : "aenderung",
            "Letzter Zugriff" : "aufgerufen"
        }
        for key, wert in drei_buttons.items():
            radioba = Radiobutton(
                frame_re, text = key, bg = "#6f6352", fg = "#ffce58",
                selectcolor = "#606060", activebackground = "#6f6352",
                variable = self.set_auswahl, value = wert)
            radioba.pack(padx = 8, anchor = "w")

        Label(
            frame_re, text = "Auswahl Endung", bg = "#6f6352",
            font = ("cambria", 11), fg = "#ffe9b3",
            justify = "left").pack(padx = 10, pady = 12, anchor = "w")
        sechs_buttons = {
            "doc" : ".doc",
            "docx": ".docx",
            "pdf" : ".pdf",
            "htm" : ".htm",
            "html": ".html",
            "py"  : ".py"
        }
        for key2, wert2 in sechs_buttons.items():
            radiobb = Radiobutton(
                frame_re, text = key2, bg = "#6f6352", fg = "#ffce58",
                selectcolor = "#606060", activebackground =  "#6f6352",
                variable = self.set_endung, value = wert2)
            radiobb.pack(padx = 8, anchor = "w")

        Label(
            frame_re, text = "Auswahl Zeitraum", bg = "#6f6352",
            font = ("cambria", 11), fg = "#ffe9b3",
            justify = "left").pack(padx = 10, pady = 12, anchor = "w")
        Label(
            frame_re, text = "Beispiel: 28.06.2017\n\nVon:",
            bg = "#6f6352", font = ("cambria", 10), fg = "#ffce58",
            justify = "left").pack(padx = 10, anchor = "w")
        von = Entry(frame_re)
        von.pack(padx = 10, anchor = "w")
        Label(
            frame_re, text = "Bis:", bg = "#6f6352",
            font = ("cambria", 10), fg = "#ffce58",
            justify = "left").pack(padx = 10, anchor = "w")
        bis = Entry(frame_re)
        bis.pack(padx = 10, anchor = "w")
        starter = Button(
            frame_re, text = "Suche", font = ("cambria", 10, "bold"),
            padx = 18, command = self.main)
        starter.pack(side = "top", pady = 18)

        def uebernehme_auswahl(event):
            self.auswahl = self.set_auswahl.get()
            self.endung  = self.set_endung.get()
            self.vondate = von.get()
            self.bisdate = bis.get()

        radioba.bind("<Button-1>", uebernehme_auswahl)
        radiobb.bind("<Button-1>", uebernehme_auswahl)
        von.bind("<Leave>", uebernehme_auswahl)
        bis.bind("<Leave>", uebernehme_auswahl)

        self.fenster.mainloop()

instanz = Dateisuche()
instanz.layout()
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Nur noch einmal ein Nachtrag, um das Beispiel nicht so stehen zu lassen. Dieses None war kein None, sondern nur ein leerer String, einen Teil der Statements auf elif und die Sortierung geändert.

Code: Alles auswählen

def wandle_datum(data):
    return int(time.mktime(time.strptime(data, "%d.%m.%Y")))

def suche_files(durchlaufe, auswahl, endung, vondate, bisdate):
    os.stat_float_times(False)
    file_dict = {}
    rueckgabe = []

    for verzeichnisse, unterordner, dateien in os.walk(durchlaufe):
        for dateinamen in dateien:
            extension = os.path.splitext(dateinamen)[1]
            if extension == endung:
                if auswahl == "alphabetisch":
                    zeitpunkt = os.path.getctime(os.path.join(verzeichnisse, dateinamen))
                    fuelledict = {os.path.join(verzeichnisse, dateinamen) : zeitpunkt}
                    file_dict.update(fuelledict)
                elif auswahl == "angelegt":
                    zeitpunkt = os.path.getctime(os.path.join(verzeichnisse, dateinamen))
                elif auswahl == "aenderung":
                    zeitpunkt = os.path.getmtime(os.path.join(verzeichnisse, dateinamen))
                elif auswahl == "aufgerufen":
                    zeitpunkt = os.path.getatime(os.path.join(verzeichnisse, dateinamen))

                if auswahl == "angelegt" or auswahl == "aenderung" or auswahl == "aufgerufen":
                    if vondate == "-" or bisdate == "-":
                        fuelledict = {zeitpunkt : os.path.join(verzeichnisse, dateinamen)}
                        file_dict.update(fuelledict)
                    elif vondate != "-" and bisdate  != "-":
                        if zeitpunkt >= wandle_datum(vondate) and zeitpunkt <= wandle_datum(bisdate):
                            fuelledict = {zeitpunkt : os.path.join(verzeichnisse, dateinamen)}
                            file_dict.update(fuelledict)

    # Reihenfolge - files und filetimes - plus lambda und lower
    if auswahl == "alphabetisch":
        sortiert = sorted(file_dict.items(), key = lambda i: i[0].lower(), reverse = 1)
        
        for files, filetimes in sortiert:
            zeitformat = time.strftime("%d.%m.%Y", time.localtime(filetimes))
            rueckgabe.append("{0:s} - {1:s}".format(files, zeitformat))

    # Reihenfolge - filetimes und files
    elif auswahl == "angelegt" or auswahl == "aenderung" or auswahl == "aufgerufen":
        sortiert = sorted(file_dict.items(), reverse = 1)
        
        for filetimes, files in sortiert:
            zeitformat = time.strftime("%d.%m.%Y", time.localtime(filetimes))
            rueckgabe.append("{0:s} - {1:s}".format(files, zeitformat))

    return rueckgabe

class Dateisuche:

    def __init__(self):
        self.fenster = Tk()
        self.set_auswahl = StringVar(value="1")
        self.set_endung  = StringVar(value="1")
        self.textfeld = None
        self.auswahl = "alphabetisch"
        self.endung  = "py"
        self.vondate = None
        self.bisdate = None
        self.durchlaufe = "."

    def main(self):
         if self.vondate is None or self.vondate == "":
             self.vondate = "-"
         if self.bisdate is None or self.bisdate == "":
             self.bisdate = "-"
             
         gefunden = suche_files(self.durchlaufe, self.auswahl,
                    self.endung, self.vondate, self.bisdate)

         self.textfeld.delete(1.0, END)

         for dateien in gefunden:
             self.textfeld.insert(1.0, "{}\n".format(dateien))

# Der rest vom Code ist unverändert. 
TuXX
User
Beiträge: 24
Registriert: Sonntag 25. Juni 2017, 17:52

Erst einmal vielen Dank für das rege Feedback auf meine Frage. Mittlerweile bin ich mit meinem Skript etwas weiter gekommen. Siehe Beispiel:

Code: Alles auswählen

import os
for folderName, subfolders, filenames in os.walk('C:\\Techdok\\'):
    texfile = open ('Verzeichnislist.txt', 'a')
    texfile.write(folderName + "\n")
    for subfolder in subfolders:
        texfile.write(subfolder + "\n")
    for filename in filenames:
        texfile.write(filename + "\n")
    texfile.close()
Dieses Skript gibt folgendes aus:

C:\Techdok (hier müssen noch die ersten drei Zeichen entfernt werden, damit ich ein schönes erstes Lesezeichen kreiren kann!)
C.\Techdok\Ordner 1 (hier kann ich für das Unterlesezeichen nur den hintersten Ordner (in diesem Fall Ordner 1 gebrauchen)
Datei.pdf (hier müssen ebenfalls wieder die letzten vier Zeichnen entfernt werden, um ein schickes Lesezeichen zu haben)

Aktuell habe ich noch keine Lösung dafür gefunden, wie ich Pfade wie z.B. C:\Techdoc\Ordner1\Datei1.pdf in eine Datei schreiben kann. Wie sieht es bei den für Tex notwendigen geschweiften und eckigen Klammern aus. Gibt es hier eine spezielle Darstellungsweise um diese korrekt in eine Datei schreiben zu können?

Im Voraus vielen Dank für euren Input!
Zuletzt geändert von Anonymous am Dienstag 4. Juli 2017, 22:00, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@TuXX: Warum öffnest und schliesst Du denn die Datei für jedes Verzeichnis? Es wäre irgendwie sinnvoller die einmal am Anfang zu öffnen und dann am Ende zu schliessen. Das hattest Du doch auch schon mal so. Am besten verwendet man beim Öffnen die ``with``-Anweisung, damit die Datei automatisch und sicher geschlossen wird wenn der Programmfluss den ``with``-Block verlässt.

Wie das mit dem zusammensetzen von Pfaden geht, wurde hier im Thema auch schon gezeigt. Melewo hat da einen Beispielcode gezeigt, der zudem auch schon das filtern nach PDF-Dateien enthält.

Eckige und geschweifte Klammern in eine Datei zu schreiben ist kein Hexenwerk. Wo ist denn das Problem dabei? Ein tatsächliches Problem ist eher sicherzustellen das Zeichen die für LaTeX eine besondere Bedeutung haben, keine Probleme machen wenn sie in normalen Daten vorkommen. Dazu kann man sich selbst eine Funktion schreiben die solche Zeichen vor LaTeX entsprechend schützt, oder etwas fertiges hernehmen. Aber das hatten wir ja auch schon mal angesprochen.

Ist Dir denn das Ziel schon klar? Denn sonst kannst Du nicht darauf hinarbeiten.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

TuXX hat geschrieben:C:\Techdok (hier müssen noch die ersten drei Zeichen entfernt werden, damit ich ein schönes erstes Lesezeichen kreiren kann!)
C.\Techdok\Ordner 1 (hier kann ich für das Unterlesezeichen nur den hintersten Ordner (in diesem Fall Ordner 1 gebrauchen)
Datei.pdf (hier müssen ebenfalls wieder die letzten vier Zeichnen entfernt werden, um ein schickes Lesezeichen zu haben)
Dafür verwende ich bisher replace(). Bei immer gleichbleibenden Zeichenfolgen scheint es mir die einfachste Lösung zu sein. Ob die beste, weiß ich hingegen noch nicht, wäre nur meine Antwort auf Zeile 1 und 3 vom Zitat.

Code: Alles auswählen

beispiel = "beispieldatei.pdf"
ausgabe = "# Ausgabe: {0:s}".format(beispiel.replace(".pdf", ""))

print(ausgabe)
# Ausgabe: beispieldatei
Und den Codeabschnitt habe ich oben noch herausgekürzt, da der nur einmal benötigt wird und in einer Variablen gespeichert werden kann, die die dann für alle anderen Statements benutzt wird.

Code: Alles auswählen

os.path.join(verzeichnisse, dateinamen)
BlackJack

@Melewo: `replace()` ersetzt alle vorkommen, auch innerhalb der Zeichenkette, ist also nicht die passende Operation um am Ende eine gewisse Anzahl von Zeichen zu entfernen. Da würde ich „slicing“ (``beispiel[:-len('.pdf')]``) oder `os.path.splitext()` verwenden.
Antworten