Ich will folgende Aufgabe lösen:
einmal wöchentlich soll ein Verzeichnis, in dem täglich 140 bis 150 EDI-Files abgelegt werden, anhand des Aktualisierungsdatums in einem ZIP-File archviert werden. Damit soll bei nachträglichen Suchen nicht der unsortierte Datenwust manuell gesichtet werden, sondern nur noch ZIP-Files herangezogen werden müssen. Das ganze dann per Batch-Datei und Python-Skript, mit dem das archivieren automatisiert abläuft. Zur Zeit sind mehrere Tausend Dateien im Verzeichnis....
Der Plan:
Aktualisierungsdaten aller Files in eine Liste schreiben und dies mit set(datumsliste) eindeutig machen.
Diese Liste wird dann durclaufen und für jedes darin enthaltene Datum den Archivierungsvorgang mit vorgeschalteter Datei-Selektion ausführen.
... so der Plan.
Leider tritt dann der u.a. Fehler auf, der vermutlich aufgrund der Liste nicht funktioniert.
Was könnte ich am Plan ändern? Dictionary erzeugen und das abarbeiten (woerterbuch={'dateinangabe' : 'dateidatum'))?
Code: Alles auswählen
import os, datetime
from zipfile import ZipFile
#Funktion zum umformatieren des Aktualisierungsdatums in das Format JJJJMMTT
def format_gmtime_from_file(filename):
modification_time = datetime.datetime.fromtimestamp(os.path.getmtime(filename))
return f"{modification_time:%Y%m%d}"
#Dateiliste erstellen
def erstelle_dateiliste(akt_dat, pattern, quellpfad):
files = os.listdir(quellpfad)
filelist=[]
for file in files:
#print(file)
if file[:6]==pattern:
mod_date=format_gmtime_from_file(quellpfad + chr(92) + file)
if mod_date==akt_dat:
filelist.append(quellpfad +chr(92) + file)
return filelist
#Dateiliste an ZIP zum archivieren übergeben
def archiviere_dateiliste(liste, archivpfaddatei):
i=len(liste)
with ZipFile(archivpfaddatei, 'w') as ergebnis_zip_datei:
# Add multiple files to the zip
for f in liste:
ergebnis_zip_datei.write(liste)
ergebnis_zip_datei.close
return i
#Ab hier soll akt_dat aus der übergeordneten datumsliste "for datum in datumsliste:-Schleife abgearbeitet werden
akt_dat='20210102'
quellpfad=r'Z:\quelleverzeichnis'
muster='MUSTER'
archivpfaddatei=r'K:\zielverzeichnis'+chr(92) + akt_dat + chr(95) + muster + '.zip'
meineliste=erstelle_dateiliste(akt_dat,muster,quellpfad)
print(meineliste)
ergebnis=archiviere_dateiliste(meineliste,archivpfaddatei) #=> ab hier tritt dann der u.a. Fehler auf
print(ergebnis +' Datei(en) archiviert')
TypeError Traceback (most recent call last)
<ipython-input-4-d3f36573b0ae> in <module>
6 meineliste=erstelle_dateiliste(akt_dat,muster,quellpfad)
7 print(meineliste)
----> 8 ergebnis=archiviere_dateiliste(meineliste,archivpfaddatei)
9 print(ergebnis +' Datei(en) archiviert')
<ipython-input-2-c94b2ef3efd2> in archiviere_dateiliste(liste, archivpfaddatei)
21 # Add multiple files to the zip
22 for f in liste:
---> 23 ergebnis_zip_datei.write(liste)
24
25 ergebnis_zip_datei.close
~\anaconda3\lib\zipfile.py in write(self, filename, arcname, compress_type, compresslevel)
1739 )
1740
-> 1741 zinfo = ZipInfo.from_file(filename, arcname,
1742 strict_timestamps=self._strict_timestamps)
1743
~\anaconda3\lib\zipfile.py in from_file(cls, filename, arcname, strict_timestamps)
521 if isinstance(filename, os.PathLike):
522 filename = os.fspath(filename)
--> 523 st = os.stat(filename)
524 isdir = stat.S_ISDIR(st.st_mode)
525 mtime = time.localtime(st.st_mtime
TypeError: stat: path should be string, bytes, os.PathLike or integer, not list