Ordner Pfad mit csv File abgleichen

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.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

So konnte ich es bis jetzt lösen, dass er mir alles ausgibt was er gefunden hat und was nicht.

Code: Alles auswählen

with open(PATH_TO_CSV, "r", newline = '') as file:
        CsvReader = pd.read_csv(file, delimiter = ',', skipinitialspace = True)
        print(CsvReader.head())

# Durchsucht den Angegebenen Pfad nur nach PDF und speichert diese in eine Variable
report_filenames = [path.parts[-3:] for path in PATH_TO_REPORTS.glob("*/*/*.pdf")]

for rows in report_filenames:
        gefunden = False
        for rows_reports in CsvReader["ReportFileName"]:
                if rows_reports == rows[2]:
                        gefunden = True
                        break
        if gefunden == True:
                print(rows_reports)
        else:
                print("Nicht gefunden: " + rows_reports)
Mit dem set habe ich mich befasst, komme aber nicht dahinter wie er mir alle ausgibt, weil es sich nach dem ersten Fund beendet.
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

`CsvReader´ ist kein Reader, sondern die Daten, die in der csv-Datei standen. Dass die aber aus einer csv-Datei kommen, ist auch nicht relevant, so dass der Name weder csv noch reader enthalten sollten, sondern etwas über dein Inhalt der Daten aussagen sollte.

Das `gefunden` kann man auch kurz schreiben als:

Code: Alles auswählen

gefunden = (daten["ReportFileName"]==rows[2]).any()
Was ist denn nun Dein konkreter nächster Schritt an dem Du nicht weiterkommst?
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Danke Sirius3

Der Code sieht jetzt so aus:

Code: Alles auswählen

# Vergleicht die Datensätze, ob die PDF im Verzeichniss auch in der csv vorhanden sind
for rows in report_filenames:
        gefunden = (rows[2] == csv_daten["ReportFileName"]).any()
        if gefunden == False:
                print("Nicht gefunden: " + rows[2])
        else:
                print("Gefunden: " + rows[2])
Funktioniert soweit, habe es auch Kontrolliert und Verglichen.
Was ist denn nun Dein konkreter nächster Schritt an dem Du nicht weiterkommst?
Der nächste Schritt wäre die die Fehlen mit folgenden Werten zu erweitern und in die csv Datei zu schreiben:
Das Datum ermitteln wann die Datei erstellt worden ist -> Datum
In welchen Ordner das PDF gefunden wurde -> Automarke
PDF Splitten und die ID speichern -> Bericht_ID (hier spilit("_") nehmen und [1] nehmen) das sollte das kleinste Problem werden
Die PDF durchsuchen nach den Wörtern (Emmunity, Emission, ESD, ISO_EL (import PyPDF2 habe ich dazu gefunden)
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Also mußt Du eine Liste anlegen und für jeden "Nicht gefunden"-Eintrag genau diese Informationen in die Liste einfügen und zum Schluß die Liste an den Pandas-Dataframe appenden.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Sirius3 hat geschrieben: Freitag 23. August 2019, 08:49 Also mußt Du eine Liste anlegen und für jeden "Nicht gefunden"-Eintrag genau diese Informationen in die Liste einfügen und zum Schluß die Liste an den Pandas-Dataframe appenden.
Wird gemacht, aber alles der Reihe nach :wink:

Mein erstes Ziel ist es das Datum auszugeben.

Code: Alles auswählen

                # Ermittelt das Datum, wann die PDF erstellt worden ist
                if platform.system() == "Windows":
                        timestamp = os.path.getmtime(PATH_TO_REPORTS)
                        print(datetime.date.fromtimestamp(timestamp))
                else:
                        stat = os.stat(PATH_TO_REPORTS)
                        try:
                                print(stat.st_birthtime)
                        except AttributeError:
                                print(stat.st_mtime)
Hier bekomme ich immer 2019-08-08
Das ist das Datum an dem ich die Daten auf meinen Laptop kopiert habe, aber erstellt (created) ist ein anderes Datum
Jemand eine Idee?
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich hatte in Erinnerung, dass das Datum in den Dateipfad codiert ist?
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Sirius3 hat geschrieben: Freitag 23. August 2019, 09:45 Ich hatte in Erinnerung, dass das Datum in den Dateipfad codiert ist?
Nur das Jahr, also 2019, 2018 usw
Aber ich benötige es vollständig als 2019-08-23 und deshalb muss ich es auslesen
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JohannX: Erste Idee wäre ja statt der Zeit wann die Datei das letzte mal verändert („modified“) wurde, tatsächlich die Zeit abzufragen an der die Datei erstellt („created“) wurde. Wobei das unter einiges Systemen gar nicht möglich ist, und es kann Dir auch passieren das Du beim Kopieren auf Deinen Laptop die Information sowieso weggeworfen hast und die Dateien dort den Zeitstempel haben an dem die Datei kopiert wurde. Ist halt die Frage ob die verwendete Software nur den Dateiinhalt oder auch die Metadaten mitkopiert hat. Es wäre ja auch eine legitimer Standpunkt, dass der Zeitpunkt wann die Dateien auf Deinem Laptop erstellt wurden, eben die Kopieraktion war.

Lehre daraus: Wenn man den kompletten Zeitstempel später noch einmal braucht, sollte man ihn irgendwo anders speichern als sich auf die Metadaten des Dateisystems zu verlassen. Die können zu leicht verloren gehen, bei ganz normalen Operationen mit den Dateien.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Das stimmt vollkommen, da gebe ich dir recht.

Wenn ich einen x-beliebiges PDF als Einstellungen öffne, sehe ich dass die Datei am 8.8 Created worden war, das ist jener Tag an dem ich die Daten auf meinen Laptop kopiert habe.
Bei Modified steht jedoch ein früheres Datum, denke dass es das richtige ist. Habe es auch mit der vorhandenen CSV verglichen, die Datums stimmen überein

Auf Stackoverflow habe ich folgendes gefunden
https://stackoverflow.com/questions/237 ... -in-python
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Wer erstellt denn die pdf-Dateien und steht vielleicht das Erstelldatum in den Metadaten der PDF? Sich auf das Filesystem sich zu verlassen halte ich für sehr fragil.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Die PDF werden von den Mitarbeitern welche die Test´s durchführen erstellt, jeweils auf deren Laptops natürlich.
In den Metadaten steht soweit ich gesehen habe als Date genau das Datum drinnen welches ich benötige, ist das selbe wie Date modified
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

So sieht der Code derzeit aus

Code: Alles auswählen

PATH_TO_CSV = "C:\daten\csv\g.csv"
PATH_TO_REPORTS = pathlib.Path("C:\daten\Berichte")
PATH_TO_LOGFILES = "C:\daten\csv\logfile.txt"
DATE_TIME = time.strftime("%Y-%m-%d")

# Liste für alle nicht gefundenen Einträge
missing = []

# Öffnet das csv File, sotiert diese und speichert es in eine Variable
with open(PATH_TO_CSV, "r", newline = '') as file:
        csv_daten = pd.read_csv(file, delimiter = ',', skipinitialspace = True)
        #print(csv_daten.head())

# Durchsucht den Angegebenen Pfad nur nach PDF und speichert diese in eine Variable
report_filenames = [path.parts[-3:] for path in PATH_TO_REPORTS.glob("*/*/*.pdf")]

# Vergleicht die Datensätze, ob die PDF im Verzeichniss auch in der csv vorhanden sind
for rows in report_filenames:
        found = (rows[2] == csv_daten["ReportFileName"]).any()
        # Falls die PDF vom Verzeichniss nicht in der CSV gefunden wurde
        if found == False:
                #print("Nicht gefunden: " + rows[2])
                # Ermittelt das Datum, wann die PDF erstellt worden ist
                if platform.system() == "Windows":
                        timestamp = os.path.getmtime(PATH_TO_REPORTS)
                        print(datetime.date.fromtimestamp(timestamp))
                else:
                        stat = os.stat(PATH_TO_REPORTS)
                        try:
                                print(stat.st_birthtime)
                        except AttributeError:
                                print(stat.st_mtime)

                # Splitet den PDF Namen um die ID zu erhalten, die ID ist IMMER 10-stellig, aber manchmal an der 2. oder 3. Stelle
                pdf = rows[2].split("_")
                if len(pdf[1]) == 10:
                        print(pdf[1])
                else:
                        print(pdf[2])

        # Falls die PDF vom Verzeichniss in der CSV gefunden wurde
        else:
                None
                #print("Gefunden: " + rows[2])
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Also dann ist es besser, statt getmtime zu nehmen, die PDFs zu parsen und das Erstelldatum dort zu extrahieren. Im Moment nimmst Du das Datum des obersten Ordners, das ist garantiert nicht immer richtig.
Wie sehen denn die PDF-Dateinamen aus? Warum ist die ID mal an der dritten und mal an der zweiten Stelle? Vor allem, kann an zweiter oder dritter Stelle etwas stehen, was keine ID ist und trotzdem 10 Zeichen lang ist?

Statt `found == False` -> `not found`. Der else-Block ist überflüssig und statt `None` benutzt man `pass`.
Eingerückt wird immer mit 4 Leerzeichen, nicht acht.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Sirius3 hat geschrieben: Freitag 23. August 2019, 12:42 Eingerückt wird immer mit 4 Leerzeichen, nicht acht.
Das hab ich mir schon gedacht, seit dem neuen Update sah die Tab-size irgendwie größer aus :o

Geht das parsen der PDF mit PyPDF2?
Die PDF-Dateinamen sehen wie gefolgt aus:

Pruefbericht_0281Y09C2W_Im_BCI_MD1CS014 - 3.1A_C3.pdf
Testreport_0281Y09C8S_ME17.0.3_CMRV-Var2_C3_CP18_DUT3.pdf
Pruefbericht_0261TY310E_EL_MG1CS211-1.2_B1_05_06.pdf

Was die ganzen Abkürzungen bedeuten weiß ich nicht, wird hier auch sicherlich nicht gebraucht werden.
Anscheinend ist der Unterschied dieser, dass manche Leute nicht Bericht schreiben sondern Test_Bericht, dann befindet sich die ID quasi eine stelle weiter hinten wegen dem split("_")
Die ID ist immer 10 Zeichen lang, dass einmal dahinter etwas steht welches auch 10 Zeichen lang ist, wäre denkbar. Dass das davor ist ist demnach unwahrscheinlich!

Also wäre es besser den PDF Namen mit split("_") zu zerlegen und das erste Element welches 10 Zeichen hat zu nehmen, oder?
Antworten