Aus Ordnerinhalt txt erstellen

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.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo __deets__ das stimmt, bin einfach durcheinander gekommen, durch testen.
Habe es wieder, so wie auch Sirius3 es mir vorgeschlagen hat.

Code: Alles auswählen

for path in INPUT_PATH.rglob('*'):
if path.is_dir():
    print (path.name)
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

@Sirius3, __deets__ Danke euch,

ich denke ich habe es, es werden auch txt erstellt für den leeren subfolder oben in meinem bsp "samonestozatest/ganjatestsubfolder1/" aber damit kann ich leben.

Vielen Dank

Code: Alles auswählen

for path in INPUT_PATH.rglob('*'):
        if path.is_dir():
            #print (path.name)
            textfiles = [f.name for f in path.glob("*.txt") if f.name != "list.txt"]
            output_filename = (OUTPUT_PATH / path.name).with_suffix('.txt')
            output_filename.write_text(",".join(textfiles))
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt doch nur pürfen, ob `textfiles` leer ist und dann keine Datei schreiben.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Danke Sirius3,
habe es jetzt so wie es sein soll, mit (dein Tipp) Prüfung leer oder nicht.

Vielen Dank Sirius3
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Guten Morgen,

ich frage mal hier, sollte das nicht Ok sein, bitte bescheid geben dann erstelle ich einen neuen Post.
Was kann ich hier besser schöner verbessern?
Die txtfiles lösche ich nach dem die Emails raus sind, eigentlich kann man darauf verzichten die txtfiles zu erstellen, gibt es noch etwas in dem code was man besser machen kann, funkionalität?

Danke euch im Voraus

Code: Alles auswählen

def textpath():
    OUTPUT_PATH = Path("/home/ja/meinordner/mein_backup")
    INPUT_PATH = Path("/home/ja/meinordner/samonestozatest")

        for path in Path(INPUT_PATH).rglob('*'):
            if path.is_dir():
                textfiles = [f.name for f in path.glob("*.txt")] #if f.name != "list.txt"]
                if textfiles:
                    output_filename = (OUTPUT_PATH / path.name).with_suffix('.txt')
                    output_filename.write_text(",".join(textfiles))
                else:
                    pass
                  
def mailsout(idemail):
   idemails = idemail
   for item in idmails:
       OUTPUT_PATH = Path(/home/ja/meinordner/mein_backup")
        for path in Path(INPUT_PATH).rglob('*txt'):
            if path.is_file():
                if item[0] in path.name:
                    #print (item[0], ' , ', path.name, ' , ', item[1])

                    with open("/home/ja/meinordner/mein_backup/"+path.name) as fp:
                        msg = MIMEText(fp.read())

                    me = 'ganja@mail'
                    msg['Subject'] = 'Anzahl :' +item[0]+'.'
                    msg['From'] = me
                    msg['To'] = item[1]
                    #msg['To'] = (', ').join(anemail.split())
                    s = smtplib.SMTP('ganjas')
                    s.send_message(msg)
                    s.quit()
                    
def main():
    textpath()
    idemail = []
    
    if idx != None:
        rows = #sql_query
        for row in rows:
            id = row[1]
            email = [2]
            
            idemail.append((id, email))
            
    mailsout(idemail)
   

if __name__ == "__main__":
    main()

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie du in ein un demselben Script sowas wie OUTPUT_PATH / path.Name stehen hast (gut), und dann wenige Zeilen später den Pfad mit String Operationen zusasmenstoppelst (großer Mist) wie hier:

open("/home/ja/meinordner/mein_backup/"+path.name)

kann ich nicht nachvollziehen. Gibt es da keinen Impuls, sowas konsistent zu gestalten? Die gleiche Dinge zu benutzen?

Auch

idemails = idemail

ist überflüssig. Benenn doch das Argument, wie du es willst. Es gibt keinen Zusammenhang zwischen dem Namen einer Variable beim aufruf, und dem in der Parameterliste.

Leere else Zweig mit einem pass drin können weg, Konstanten gehören an den Anfang des Programms, und schon muss man die nicht mehrfach deklarieren, und vermeidet inkonsistenzen. Was der Sinn und Zweck von Konstanten ist.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

ganja hat geschrieben: Donnerstag 24. März 2022, 11:45 Leider bekomme ich den Inhalt nicht so wie ich es mir vorstelle. Ich dachte ich suche hier schon rekursiv, habe Unterordner im Unterordner1 es wird der Inhalt in einer txt erzeugt aber mit dem Namen des ersten Unterordner und nicht Unterordner1.
Im Moment ist mir immer noch nicht ganz klar, was der Unterschied zwischen dem "ersten Unterordner" und "Unterordner1" ist. Sicherlich wäre es ganz sinnvoll, ein besseres Bild davon zu erhalten, wie Deine Ordnerstruktur tatsächlich aussieht. Unter den meisten Linuxen gibt es da ein Paket namens "tree", das -- oh Wunder -- ein Programm namens tree(1) bereitstellt. Dieses Programm erstellt rekursiv eine hübsche Repräsentation Deines Verzeichnisbaums, die Du dann bitte einmal hier posten möchtest -- wenn es sehr viele Dateien und Ordner sind, womöglich auch gekürzt, aber dann jedenfalls so, daß sich die Struktur Deiner Verzeichnisse halbwegs erkennen und nachvollziehen läßt. Zusätzlich wäre es ganz schon, wenn Du einmal auf der Basis dieser Verzeichnisstruktur manuell ein kleines Beispiel erstellst, wie Deine Ausgabedateien aussehen sollen. Vielen Dank und viel Erfolg.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo @LukeNukem das vom 24 hat sich ja erledigt, Danke.

Hallo __deets__Vvielen Dank, ich sehe was du mit OTPUT_PATH meinst, werde ich anpassen.
Doch es gibt den Impuls gleiche dinge zu benutzten, deshalb habe ich euch gefragt, leider ist mir nicht ...
Else "pass" mache ich noch weg und "Konstanten gehören an den Anfang des Programms" versuche ich umzusetzen.

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

@ganja: bevor Du fragst, wie man den Code verbessern kann, sollte der erst einmal überhaupt korrekt sein. Die Einrückungen stimmen nicht, da fehlen Anführungszeichen, es gibt Schreibfehler, `idx` ist nicht definiert. `email` wird eine Liste zugewiesen, was nicht sehr sinnvoll ist.
Das Minimum an eigenem Engagement (das eigene Geschreibsel einmal zu starten) hast Du nicht erfüllt.
Es ist absolut unsinnig, erst alle Verzeichnisse durchzugehen, um Text-Dateien zu erzeugen und dann nochmal alle Verzeichnisse durchzugehen, um diese Text-Dateien wieder einzulesen. Das macht man in einem Schritt und spart sich das Schreiben der Datein.

Code: Alles auswählen

INPUT_PATH = Path("/home/ja/meinordner/samonestozatest")
SENDER = 'ganja@mail'

def collect_text_files(input_path):
    for path in input_path.rglob('*'):
        if path.is_dir():
            textfiles = [f.name for f in path.glob("*.txt")]
            if textfiles:
                yield path.name, textfiles

def send_mail(smtp, id, email, textfiles):
    msg = MIMEText(",".join(textfiles))
    msg['Subject'] = f'Anzahl :{id}.'
    msg['From'] = SENDER
    msg['To'] = email
    smtp.send_message(msg)

def send_mails(input_path, emails):
    smtp = smtplib.SMTP('ganjas')
    for name, textfiles in collect_text_files(input_path):
        for id, email in emails:
            if id in name:
                send_mail(smtp, id, email, textfiles)
    smtp.quit()
                    
def main():
    emails = sql_query()
    send_mails(INPUT_PATH, emails)

if __name__ == "__main__":
    main()
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo @Siries3,

da bin ich bei copy paste verrutscht, habe es nach dem abmelden gesehen, konnte es aber nicht mehr ändern.

Vielen Dank für dein bsp.
Antworten