Seite 3 von 3

Re: txt mail etc

Verfasst: Mittwoch 12. August 2020, 15:36
von ganja
Hola,
Wie kann ich in dem bsp von @Sirius3 files abschneiden, egal was ich versuche ich bekomme die Fehler Meldung Posixpath hat kein Split oder so in der art.
ich habe versucht
files.split('/')[-1]
aber es geht nicht, irgendetwas mache ich falsch mit dem split() und der Formatierung aber ich komme nicht drauf was mach ich falsch.

Code: Alles auswählen

from pathlib import Path
def find_files(path, patterns):
    return [p for p in path.rglob('*')
        if any(p.match(pattern) for pattern in patterns)
    ]

path = Path("/home/abc/abcd")
files = find_files(path, ["12121*.txt", "12122*.txt", "12123*.txt", "12124*.txt", "12125*.txt", "12126*.txt", "12127*txt", "112128*.txt", "12129*.txt", "12130*.txt", "14561*.txt", "15678*.txt"])
print(files)
ich brauche eigentlich nur die .txt den Pfad an sich brauche ich nicht, wenn das mit abschneiden geht möchte ich eine .txt Datei erstellen wo die ganzen .txt aus den Ordner und Unterordner sind.
So bald ich das hin bekomme, würde ich gerne meinen ganzen code posten, es sieht sehr schlecht aus aber es funktioniert, ich hoffe irgendjemand hat dann zeit und Lust mir Tipps und Hilfe zu geben den Code ordentlich umzuschreiben.

Re: txt mail etc

Verfasst: Mittwoch 12. August 2020, 16:32
von Sirius3
Mit Stringmethoden kommst du bei Pfadobjekten nicht weit. Hast du dir schon die Dokumentation zu pathlib durchgelesen?

Re: txt mail etc

Verfasst: Mittwoch 12. August 2020, 18:41
von ganja
Hallo Sirius3, ja die doku habe ich mir angeschaut drüber geflogen, und nicht viel verstanden, wenn ich das so offen und ehrlich sagen darf.
https://docs.python.org/3/library/pathlib.html

Re: txt mail etc

Verfasst: Mittwoch 12. August 2020, 18:55
von Sirius3
Was hast Du daran nicht verstanden? Also es dürfte nicht allzu schwer sein, herauszufinden, was man aufrufen muß, um den Dateinamen zu bekommen.

Re: txt mail etc

Verfasst: Donnerstag 13. August 2020, 11:54
von ganja
Sirius3 Vielen Dank, ich glaube ich habe es, steht in der doku <str(p)>.

Jetzt habe ich nur noch ein kleines problem, unten im code wenn ich fx ausgebe in der shell passt es, es stehen Dateien untereinander, wenn ich dann die datein in ein textfile schreiben will mit with open klappt es nicht, entweder steht da nur eine datei die letzte oder alle doppelt egal wie ich es versuche, wie macht man das?
Wie übergebe ich aus der for schleicfe <fx> an with open und schreibe die dateien untereinander, ich habe 4 .txt in den ganzen subfoldern gefunden und möchte es in ein neues txt file untereinander schreiben?

hellmich_files = ["11111*.txt", "11112*.txt", "11115*.txt", "11116*.txt", "11118*.txt"]

Code: Alles auswählen

def find_files(path, patterns):
    return [p for p in path.rglob('**/*')
        if any(p.match(pattern) for pattern in patterns)
    ]
    
def test_daten():
    #print (find_files)
    test_f = []
    fx = []
    test_file = find_files(path, test_files)
    anzahl_test = len(test_file)
    #print (anzahl_test)
    for f in test_file:
        test_f.append(str(f))
        for fx in test_f:
            fx = fx.split('/')[-1]
        print (fx,'#')

    with open("/home/a/abc/testfiles/test_texttest.txt", "w") as f_output:
        f_output.write(aktuell + '\n''\n''\n')
        f_output.write("wieviel .txt: " + str(anzahl_hellmich) + '\n\n')
        f_output.write("namen der txt's: \n" + str(fx) + '\n')

  
hellmich_daten()

Re: txt mail etc

Verfasst: Donnerstag 13. August 2020, 12:32
von Sirius3
Genau das habe ich auch gemeint, ignoriere alles, was in der Dokumentation zu Pfaden steht und wandle alles in Strings um, um dann mit Stringmethoden darauf herumzuhämmern.
Es ist auch sehr sinnvoll, diese Strings in eine Liste zu stecken um danach alle Elemente durchzugehen, die Ergebnisse aber alle bis auf das letzte gleich wieder wegzuwerfen.
Liest Du eigentlich auch durch, was Du hier schreibst?
`hellmich_daten` ist nicht definiert, `path` und `test_files` kommen aus dem nichts.
Dass überall test steht, trägt nicht zum besseren Verständnis bei. Benutze aussagekräftige Namen ohne irgendwelche Zusätze.

Lies bitte das durch, und versuche zu verstehen, warum Dein Code an vielen Stellen so anders aussieht:

Code: Alles auswählen

def write_mailtext_to_file(filename, path, patterns, aktuell):
    filenames = []
    for path in find_files(path, patterns):
        filenames.append(path.name)
    with open(filename, "w", encoding="utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"wieviel .txt: {len(filenames)}\n\n")
        output.write(f"namen der txt's: \n{'\n'.join(filenames)}\n")

Re: txt mail etc

Verfasst: Freitag 14. August 2020, 12:40
von ganja
@Sirius3 du hast recht, ich habe meinen vorherigen Post nicht durchgelesen, sorry.
Habe mir jetzt dein bsp angeschaut lang angeschaut teilweise verstanden, um alle files aus den ordnern und unterordnern auszulesen wäre das der richtige weg, und in "filename" zu schreiben, ist das so richtig?

In deinem bsp in der letzten zeile ist ein fehler drin,
output.write(f"namen der txt's: \n{'\n'.join(filenames)}\n")
SyntaxError: f-string expression part cannot include a backslash

1x brauche ich alle files aus den unterordnern.
1x brauche ich nur bestimmte files, da ist das erste bsp von Sirius3 für mich besser .

filesA.txt sieht dann so aus:
2020-08-14_13:08:47


Anzahl PDF's: 4

/home/a/abc/abcd/abcdf/11114.txt
/home/a/abc/abcd/abcdf/abcdfg/11116_a_b_c_d_e_f.txt
/home/a/abc/abcd/abcdf/abcdfg/11113_irgend_etwas_steht_da.txt
/home/a/abc/abcd/abcdf/abcdfg/11119_hier_steht_auch_etwas.txt

Ich brauche den ganzen Pfad nicht, es muss doch möglich sein mit dem Code wie im moment ist, dass ich nur die formatierung anpasse, nur die Namen der txt in das Textfile zu schreiben.
Die filesA.txt solte so ausschauen.
11114.txt
11116_a_b_c_d_e_f.txt
11113_irgend_etwas_steht_da.txt
11119_hier_steht_auch_etwas.txt

Bitte falls einer das schon mal gemacht hat. Für euch Profis ist das nicht unmöglich.
Vielen Dank im Voraus

Code: Alles auswählen

bestimmtefilesA = ["11114*.txt", "11116*.txt", "11113*.txt","11119*.txt"]
bestimmtefilesB = ["11112*.txt", "11117*.txt", "11118*.txt","11115*.txt","12345.txt"]
...C
...D
#usw.

def find_files(path, patterns):
    return [p for p in path.rglob('**/*')
        if any(p.match(pattern) for pattern in patterns)
    ]
 
def filesA():
    #print (find_files)
    files = []
    fileA = find_files(path, bestimmtefilesA)
    #files.append(str(fileA))
    #files.append(fileA)
    
    with open("/home/a/abc/mailfiles/filesA.txt", "w", encoding= "utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"Anzahl TXT's: {len(fileA)}\n\n")
        output.write(f"\n" .join(str(item) for item in fileA))
    #return filesA
filesA()

def filesB():
    #print (find_files)
    files = []
    fileB = find_files(path, bestimmtefilesB)
    #files.append(str(fileB))
    
    with open("/home/a/abc/mailfiles/filesB.txt", "w", encoding= "utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"Anzahl TXT's: {len(fileB)}\n\n")
        output.write(f"\n" .join(str(item) for item in fileB))
    #return filesB
filesB()

Re: txt mail etc

Verfasst: Freitag 14. August 2020, 12:51
von Jankie
Deine zwei Funktionen machen exact das gleiche, nur der Pfad ist anders. Schreib eine Funktion und gib den Pfad als Paramter mit.
files wird erzeugt und nirgends mehr benutzt.
Die Funktionen kennen die Varaible path nicht.

Wenn du nur den Dateinamen willst: Schau mal ob du mit der split() Methode weiter kommst.

Verstehst du überhaupt was du da machst? Du solltest eventuell mal ein Grundlagentutorial durcharbeiten.

Re: txt mail etc

Verfasst: Freitag 14. August 2020, 12:58
von sparrow
@Jankie: Split auf Pfaden um an den Dateinamen zu kommen, soll er ja gerade nicht machen. Er hat doch schon Pfad-Objekte und Sirius3 hat doch Code gepostet, wie man den Dateinamen aus dem Objekt bekommt.

Re: txt mail etc

Verfasst: Freitag 14. August 2020, 13:00
von Sirius3
Da das mit den Blackslashes so nicht funktioniert, muß man es eben in zwei Zeilen schreiben:

Code: Alles auswählen

names = '\n'.join(filenames)
output.write(f"namen der txt's: \n{names}\n")
Und dann hast Du die entscheidende Zeilen weggeworfen. Warum auch immer. Und warum Du jetzt wieder so unsinnige Variablennamen fileA oder fileB benutzt, und zwei identische Funktionen definiert, ...
Lerne, was Funktionen und ihre Argumente sind, sonst trittst Du immer auf der Stelle.

Re: txt mail etc

Verfasst: Freitag 14. August 2020, 13:02
von Jankie
Okay tut mir Leid, habe nicht alles hier in dem Thread durchgelesen. Dann muss er

Code: Alles auswählen

Path("/home/a/abc/abcd/abcdf/11114.txt").name
benutzen.

Re: txt mail etc

Verfasst: Samstag 15. August 2020, 08:28
von ganja
Guten morgen,
Vielen Dank hab es hinbekommen Dateinamen aus dem Objekt, Danke Danke Danke.

@Sirius kannst du mir erklären wie ich die 2 Funktion die du mir als bsp gepostet hast nutzen kann? Sorry man, ich verstehe es nicht ganz.

Falls ich euch alle zu sehr nerve, und meine Anfänger Fragen nicht angemessen sind, gibt mir Bescheid dann melde ich mich ab. Noch Einmal Vielen Dank für jeden Tipp, bsp, Kritik usw, ich versuche es wirklich aber es dauert ...

Wie kann ich in der Funktion mit eine Schleife nach
filesA = ["11114*.txt", "11116*.txt", "11113*.txt","11119*.txt"]
filesB = ["11112*.txt", "11117*.txt", "11118*.txt","11115*.txt","12345.txt"]
suchen, und den in 2 Textfiles schreiben filesA.txt inhalt filesA, filesB.txt inhalt filesB.

Ihr habt recht ich muss noch viel lernen, das tue ich gerade in dem ich es versuche und wenn ich nicht weiter komme frage ich euch, bin wirklich dankbar.
Der Eine versteht es schneller der Andere etwas langsamer ich bin einer von den langsamen.

Re: txt mail etc

Verfasst: Samstag 15. August 2020, 18:18
von Sirius3
Warum zeigst Du nicht Deinen Code? Und an welcher Stelle Du es nicht schaffst, meine Funktionen einzuginden? Ich weiß nicht, wie ich da noch mehr helfen kann, als das, was eh schon als Argumentennamen steht, filename -> Dateiname in der die Ausgabe geschrieben wird, path -> Pfad unter dem die Dateien gesucht werden sollen, patterns -> Muster, die die Dateien haben müssen, aktuell -> keine Ahnung, das hast Du ja auch nur so von irgendwoher gezaubert.

Re: txt mail etc

Verfasst: Montag 17. August 2020, 14:19
von ganja
Hallo, bitte nicht gleich wieder die Namen schimpfen, mir fallen kein besseren Namen ein.
Ich denke das in allfiles() alles da ist was ich brauche, ich weiß nur nicht wie ich es umsetzen soll!
Vielleicht kann einer mir hier Helfen ,mich irgendwie auf die richtige Spur bringen, ich sehe das ich funktionen wiederhole mir ist klar das es unnötig ist 2 gleiche Funktionen zu benutzen, aber ich weiß im Moment nicht besser, nicht weiter.
Danke im Voraus


Code: Alles auswählen

#!/usr/bin/python3

from pathlib import Path
#import os
from datetime import datetime, timedelta
#import time
import smtplib
from email.mime.text import MIMEText


now = datetime.now()
#now = two_hours_from_now = datetime.now() + timedelta(hours=2)
aktuell = (now.strftime("%Y-%m-%d_%H:%M:%S"))
datum = (now.strftime("%Y-%m-%d"))

#Pfad wo 
path = Path("/home/a/ab/abc")

# für funktion von Sirius3
filename = "/home/a/ab/abc/abcd/file.txt"

user1_files = ["11111*.txt", "11112*.txt", "11114*.txt", "11117*.txt"]
user2_files = ["11113*.txt"]
user3_files = ["11116*.txt", "11118*.txt", "22222*.txt", "22221*.txt"]
usw

user1_files_email =  'user1@mail, user4@mail, user5@mail, user6@mail'
user2_files_email =  'user2@mail, user3@mail, user7@mail, user8@mail'
user3_files_email =  'user10@mail, user11@mail, user12@mail, user13@mail'
usw

#versuch liste in liste mehrere dateien für mehrere user
dateien_file = [[user1_files], [user2_files],[user3_files]]

#alle dateien aus unterordner in eine txt schreiben
def allfiles():
    alledateien = [] 
    files = [p for p in path.rglob('**/*.txt')]
    for dateien in files:
        alledateien.append(dateien.name)
    with open("/home/a/ab/abc/abcd/"+datum+"_allfiles.txt", "w", encoding="utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"wieviel .txt: {len(alledateien)}\n\n")
        names = '\n'.join(alledateien)
        output.write(f"namen der txt's: \n{names}\n")

#nach bestimmten datein suchen bsp von Sirius3, da allfiles() funktioniert brauche ich das hier überhaupt, oder brauche ich allfiles() überhaupt?
def find_files(path, patterns):
    return [p for p in path.rglob('**/*')
        if any(p.match(pattern) for pattern in patterns)
    ]

# gleich wie oben aber noch offene fragen bsp von Sirius3, und brauche ich das überhaupt, für einen user file.txt für email erstellen
def write_mailtext_to_file(filename, path, patterns, aktuell):
    filenames = []
    for path in find_files(path, patterns):
        filenames.append(path.name)
    with open(filename, "w", encoding="utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"wieviel .txt: {len(filenames)}\n\n")
        names = '\n'.join(filenames)
        output.write(f"namen der txt's: \n{names}\n")

#für einen user file.txt für email erstellen, brauche ich das überhaupt
def user1_daten():
    user1_f = []
    #user1_file = find_files(path, user1_files)
    for user1_file in find_files(path, user1_files):
        user1_f.append(user1_file.name)
    #print (user1_f)
    with open("/home/a/ab/abc/abcd/user1.txt", "w", encoding= "utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"Anzahl PDF's: {len(user1_f)}\n\n")
        names = '\n'.join(user1_f)
        output.write(f"Abgeholte PDF's: \n\n{names}\n")

#
###### nach dateien suchen für mehrere user
#hier sollte eine Funktion sein mit der 
#ich in <dateien_file> nach files suche 
#und dann txt erstellen
# user1.txt
#user2.txt
#user3.txt

#send email für einen user mit dem ensprechneden text aus der file.txt für diesen user
def email_user1():
  with open('/home/a/ab/abc/abcd/user1.txt') as fp:
        # Create a text/plain message
        msg = MIMEText(fp.read())
        
    me = 'ich@mail'
    you = 'user1@mail, user4@mail, user5@mail, user6@mail'
    msg['Subject'] = 'Anzahl  txt für user1: "11111, "11112", "11114", "11117.'
    msg['From'] = me
    msg['To'] = you
    
    # Send the message via our own SMTP server.
    s = smtplib.SMTP('localhost')
    s.send_message(msg)
    s.quit()
#email_user1()


#hier sollte eine funktion stehen
# mit der ich die ganzen mails versenden kann
# bin mir nicht sicher ob das überhaupt geht

def main():
    print ("hallo")
    allfiles()
    user1_daten()
    #write_mailtext_to_file()
    email_user1()
    


if __name__ == '__main__':
    main()

Re: txt mail etc

Verfasst: Montag 17. August 2020, 14:49
von Sirius3
Das einfachste wäre erst einmal Code zu schreiben der korrekt eingerückt ist. So kommt das nämlich gar nicht am Compiler vorbei.
Und du willst mir ernsthaft erzählen, dir fiele für eine Liste mit Dateinamen kein besserer Variablenname ein als f?
Wenn du noch nicht verstanden hast, was Funktionen sind, dann hilft es nichts, wenn wir dir zum neunten Mal Code posten, der dich nicht weiter bringt. Lege deine jetzige Aufgabe zur Seite und arbeite ein Anfängertutorial durch.

Re: txt mail etc

Verfasst: Montag 17. August 2020, 15:37
von ganja
@Sirius3 Vielen Dank, Code ist richtig eingerückt es funktioniert bei mir.
Dann muss ich wohl es so belassen wie es ist, es funktioniert, ich schau mir ein Anfängertutorial an, aber das wird den Code auch nicht schöner schreiben :? .
Ich habe jetzt Zeit, ein paar Tage noch und dann ist es wieder rum, und vielleicht komme ich erst wieder in 1-2 Jahren dazu irgendetwas in Python zu programmieren.
Habe gehofft auf ein bsp. oder irgendetwas womit ich weiter komme und es abschliessen kann.
Trotzdem Vielen Vielen Dank, Jungs bleibt gesund

Re: txt mail etc

Verfasst: Dienstag 18. August 2020, 12:35
von ganja
Servus,
habe nochmal versucht Code anzupassen, ich denke ich nähere mich der Lösung, aber noch nicht optimal wie ich es mir vorstelle.
Ich hänge den Code noch mal dran, vielleicht hat einer noch einen Tipp oder bsp oder irgend etwas was mich weiter bringt, Code funktioniert ich möchte es leserlicher und schöner und einfacher.

Irgendeiner einen Tipp für mich den ich als anfänger umsetzen kann oder ein bsp

Code: Alles auswählen

#!/usr/bin/python3

from pathlib import Path

from datetime import datetime, timedelta
import smtplib
from email.mime.text import MIMEText


now = datetime.now()
aktuell = (now.strftime("%Y-%m-%d_%H:%M:%S"))
datum = (now.strftime("%Y-%m-%d"))

#Pfad wo 
path = Path("/home/a/abc/abcd")

##### files zu user
user1_files = ["111*.txt"]
user2_files = ["112*.txt","114*.txt", "116*.txt", "117*.txt", "118*.txt", "119*.txt"]
user3_files = ["113*.txt", "115*.txt", "120*.txt", "121*.txt"]
#usw

allefilesuser = user1_files + user2_files + user3_files

def allfiles():
    alledateien = [] 
    files = [p for p in path.rglob('**/*.txt')]
    for dateien in files:
        alledateien.append(dateien.name)
    with open("/home/a/abc/abcd/abcde/"+datum+"_allefiles.txt", "w", encoding="utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"wieviel .txt: {len(alledateien)}\n\n")
        names = '\n'.join(alledateien)
        output.write(f"namen der txt's: \n{names}\n")

def find_files(path, patterns):
    return [p for p in path.rglob('**/*')
        if any(p.match(pattern) for pattern in patterns)
    ]

def textfiles_mails():
    user1_f = []
    user2_f = []
    user3_f = []
    #usw
    
    for user1_file in find_files(path, user1_files):
        user1_f.append(user1_file.name)
    for user2_file in find_files(path, user2_files):
        user2_f.append(user2_file.name)
    for user3_file in find_files(path, user3_files):
        user3_f.append(user3_file.name)
    #usw
    
    with open("/a/ab/abc/test/abcd/user1.txt", "w", encoding= "utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"Anzahl PDF's: {len(user1_f)}\n\n")
        names = '\n'.join(user1_f)
        output.write(f"Abgeholte PDF's: \n\n{names}\n")
    with open("/a/ab/abc/test/abcd/user2.txt", "w", encoding= "utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"Anzahl PDF's: {len(user2_f)}\n\n")
        names = '\n'.join(user2_f)
        output.write(f"Abgeholte PDF's: \n\n{names}\n")
    with open("/a/ab/abc/test/abcd/user3.txt", "w", encoding= "utf8") as output:
        output.write(f"{aktuell}\n\n\n")
        output.write(f"Anzahl PDF's: {len(user3_f)}\n\n")
        names = '\n'.join(user3_f)
        output.write(f"Abgeholte PDF's: \n\n{names}\n")
    #usw    
    
def sendmail():
    with open('/a/ab/abc/test/abcd/user1.txt') as fp:
        # Create a text/plain message
        msg = MIMEText(fp.read())
        
    me = 'me@mail'
    you = 'user1@mail, user4@mail, user20@mail, user21@mail'
    msg['Subject'] = 'Anzahl txt fuer : 111.'
    msg['From'] = me
    msg['To'] = you
    
    # Send the message via our own SMTP server.
    s = smtplib.SMTP('localhost')
    s.send_message(msg)
    s.quit()
    
    with open('/a/ab/abc/test/abcd/user2.txt') as fp:
        # Create a text/plain message
        msg = MIMEText(fp.read())
        
    me = 'me@mail'
    you = 'user2@mail, user5@mail, user6@mail, user7@mail, user20@mail, user21@mail'
    msg['Subject'] = 'Anzahl txt fur: 112,114, 116, 117, 118, 119.'
    msg['From'] = me
    msg['To'] = you
    
    # Send the message via our own SMTP server.
    s = smtplib.SMTP('localhost')
    s.send_message(msg)
    s.quit()
   
   #usw

def main():
    print ("hallo")
    allfiles()
    textfiles()
    sendmail()


if __name__ == '__main__':
    main()

Re: txt mail etc

Verfasst: Dienstag 18. August 2020, 13:33
von Sirius3
Es gilt das selbe was schon ganz zu Anfang gesagt wurde: statt Variablen durchzunummerieren benutzt man Listen und Schleifen. Statt das was zu User1 oder User2 gehört im ganzen Programm zu verstreuen, definiert man passende Strukturen. Dateinamen definiert man am Anfang als Konstanten. Sind die Dateien überhaupt wichtig oder soll alles nur als Mail versandt werden? Weil dann schreib erst gar nichts in Dateien.

Re: txt mail etc

Verfasst: Dienstag 18. August 2020, 15:32
von ganja
Hallo @Sirius3, Danke dir das du dich beteiligst, aber ich versuche mit meinem Kenntnisstand stand das was am Anfang gesagt wurde umzusetzen.
Aus meinem Code alle Dateien in eine .txt zu schreiben ist wichtig, das muss sein.
Alles andere als bsp user2_files = ["112*.txt","114*.txt", "116*.txt", "117*.txt", "118*.txt", "119*.txt"] die Dateien müssen nicht in eine Datei.txt geschrieben werden, aber ich muss an mehrere user email senden das diese Dateien vorhanden sind. Deshalb war es für mich am einfachsten user2_files zu definieren und danach zu suchen txt Datei erstellen dann die txt Datei in email einlesen email senden txt Dateien löschen.
Sirius3 hast du mir einen bsp wie man das anderest besser schöner erledigen kann?
Ich komme selber leider nicht drauf, sorry.
Danke Sirius3, Vielen Dank dass du bisher an einer Lösung für mein Problem teil genommen hast .... Danke
Auch Danke an alle Anderen