Integrität von Dateien durch programmiertes Öffnen mit (Office)-Anwendungen testen

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.
Antworten
Benutzeravatar
Silberreiher
User
Beiträge: 3
Registriert: Dienstag 9. November 2021, 18:14

Hallo,

auf einer externen Festplatte habe ich sehr viele Dateien, die zwar technisch gelesen (also z. B. kopiert oder umbenannt) werden können, deren Inhalt aber korrumpiert ist, sprich Excel, Word und Co. melden Fehler beim Öffnen der Datei und alle Reparaturversuche, die diese Programme anbieten, schlagen fehl.

Um festzustellen, welche der Dateien in Wirklichkeit kaputt sind (und durch ein älteres Backup ersetzt werden sollen), habe ich folgende Idee für mein erstes "größeres" Python-Programm:
  • Rekursives Auslesen der gesamten Platte (bzw. ab einem einzugebenden Startverzeichnis) mittels os.walk
  • Aufruf des passenden Programms (Excel, Word, Powerpoint, Acrobat Reader, IrfanView, ....) für jede einzelne gefundene Datei mit einer entsprecheden Endung
  • Auflistung (optional) aller Dateien mit OK bzw. nur derjenigen, die nicht geöffnet werden können (ERROR) samt vollständigem Pfad
  • Ausbau der obigen Funktion (z. B. Verschieben in ein Lazarett-Verzeichnis usw., Schreiben der vollständigen Pfade in eine Datei, Erzeugen einer Skriptdatei für MOVE/COPY der Dateien usw.)
Bei der Frage, wie ich jetzt word.exe; excel.exe und Konsorten von Python aus aufrufe (also die Originalprogramme, nicht das Öffnen der Dateien mithilfe diverser Bibliotheken) , die zu prüfende Datei übergebe, eventuelle Fehler passend abfange und einen Return-Code auswerte - da wurde ich beim Googlen noch nicht wirklich fündig.

Und deshalb bin ich hier und hoffe auf Tipps...

Regards,

Silberreiher
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Silberreiher,

os.walk würde ich nicht nutzen. Pathlib und glob sind komfortabler.
https://docs.python.org/3/library/pathl ... .Path.glob

Ausgabe aller Textdateien im C-Laufwerk:

Code: Alles auswählen

import pathlib

SEARCHDIR = r"C:\\"

root = pathlib.Path(SEARCHDIR)

for file in root.glob("**/*.txt"):
    print(file)
Für Excel Dateien gibt es zum Beispiel openpyxl
https://openpyxl.readthedocs.io/en/stable/

Für Word Dateien python-docx:
https://python-docx.readthedocs.io/en/latest/

Für Pdf reicht PyPDF2:
https://pythonhosted.org/PyPDF2/

Für Bilder pillow:
https://pillow.readthedocs.io/en/stable/

Fehler fängt man in Python durch Exceptionhandling ab:
https://docs.python.org/3/tutorial/erro ... exceptions
Benutzeravatar
Silberreiher
User
Beiträge: 3
Registriert: Dienstag 9. November 2021, 18:14

Hallo, rogerb,

vielen Dank für die schnelle (also eigentlich war das geradezu realtime) und ausführliche Antwort, jetzt weiß ich, in welche Richtung ich gehen muss.

Mit OpenPyxl habe ich als alter Excel-Nerd und VBAler schon experimentiert, aber hier und auch für die anderen Bibliotheken gilt, dass ich eher das Original-Programm aufrufen und die Datei an dieses übergeben und dann eventuelle Fehlercodes/Return-Codes auswerten will.

Das deshalb weil ich sicher sein will, dass die Datei dann auch mit dem Original-Programm von mir oder jemandem, dem ich Datei übermittle, geöffnet werden kann und mich nicht ein fehlerfreies load_workbook durch eine Bibliothek, die toleranter ist als das Originalprogramm, in falsche Sicherheit wiegt. Also etwas wie (und ich hoffe, das führt jetzt nicht zu meinem Ausschluss aus dem Forum ;-) ) das hier, wenn ich es in VBA als Excel-Applikation programmieren würde.

Set WordObj = CreateObject("Word.Applcation")
On Error Goto Fail
WordObj.Open(strFilePath)
WordObj.Close

Regards,

Silberreiher
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Silberreiher,

ich denke, wenn du die Originalapplikation in python "fernsteuern" willst, bleibt nur pywin32. Damit bekommst zu Zugriff auf die WIN32-API in Python.
https://pypi.org/project/pywin32/

Für pywin32 und Excel gibt es auch einige Beispiele im Netz. Je nachdem wie gut du dich mit der WIN32-API auskennst kannst du das dann ähnlich bei anderen Applikationen machen.
Ich habe mich selber aber noch nicht viel damit beschäftigt, da es ja andere komfortablere Möglichkeiten gibt.
Benutzeravatar
Silberreiher
User
Beiträge: 3
Registriert: Dienstag 9. November 2021, 18:14

Vielen Dank. Ich werde von meinen (Miss-)Erfolgen hier berichten. Da es ein Hobbyprojekt ist, wird es aber etwas dauern.
Antworten