Seite 1 von 1

Weiss nicht wie ich suchen soll?

Verfasst: Donnerstag 5. März 2020, 15:40
von Xanthariel
Hallo zusammen,
ich bin ein blutiger Anfänger in Sachen programmierung und versuche mich nun anhand von kleineren Projekten in Python3 einzuarbeiten.
Mein Problem ist, dass ich eher Shell-Skripte geschrieben hatte und daher sehr linear an die Sacher herangehe.

"...Erst die Socken, dann die Schuhe..."

Nun habe ich vor aus einer gezippten Datei ein paar Informationen heraus zu lesen und diese dann weiter zu verarbeiten.

Bisher habe ich die gepackte Datei entpackt und bin dann in das Verzeichnis der Zipdatei gewechselt wo sich die META.INF Datei befindet.
Kann man nicht auch direkt in der ZIP-Datei in der Datei suchen?
Muss man die wirklich erst entpacken?
Diese habe ich dann zeilenweise eingelesen.

Und nun weiss ich nicht mehr weiter.
Der Inhalt ist keine Liste im Sinne von [1,2,3,4,5] sondern sieht so aus:

Code: Alles auswählen

var1=Wert1
var2=Wert2
var3=Wert3
Ich möchte nun Wert1 einer Variable varName und Wert2 einer Variable varVersion zuordnen um dann weiter zu machen.
Wie komme ich hier weiter?

Re: Weiss nicht wie ich suchen soll?

Verfasst: Donnerstag 5. März 2020, 16:21
von einfachTobi
Bitte 1. den vollständigen und tatsächlichen Code in 2. Code-Tags (vollständige Editor, </>-Button) zeigen. Wie liest du die Datei ein, sodass es keine Liste ist? Warum nummerierst du Variablen, obwohl z. B. eine Liste besser geeignet wäre? Offenbar schreibst du nicht genau das, was du meinst, denn die angefragte Zuordnung lautet `varName = Wert1`, so wie du es schon gemacht hast. Willst willst du also *eigentlich* machen? Bitte konkretisiere das Problem mithilfe von Code, dem Verhalten des Codes und deinem erwarteten Verhalten.

Re: Weiss nicht wie ich suchen soll?

Verfasst: Donnerstag 5. März 2020, 19:19
von __blackjack__
@Xanthariel: In der Standardbibliothek gibt es das `zipfile`-Modul mit dem man Dateien direkt ”in” ZIP-Archiven zum auslesen öffnen kann. Man muss also nicht das ganze Archiv entpacken um beispielsweise eine im Archiv enthaltene "META.INF"-Datei zu verarbeiten.

Sind es wirklich "META.INF"-Dateien oder eher Dateien in einem "META-INF"-Verzeichnis? Und was sind das für Dateien? Java ”*.properties”-Dateien? Da gäbe es beispielsweise dieses Modul zum parsen (und schreiben): https://pypi.org/project/jproperties/

Re: Weiss nicht wie ich suchen soll?

Verfasst: Freitag 6. März 2020, 09:30
von Xanthariel

Code: Alles auswählen

import os
import zipfile

with zipfile.ZipFile("foo.zip", "r") as archive:
    archive.extractall("unpacked")
    # Entpackt das ZipFile nach unpacked = OK

# Gibt META-INF zeilenweise aus = OK
darInfo = open("unpacked/META-INF/dar.info")
for line in darInfo:
    print(line.rstrip())
# darInfo.close()

# Auslesen von ZipName und ZipVersion
die entsprechende Ausgabe ist:

Code: Alles auswählen

dar.name=ding-dong-webservices-deploy
dar.version=4711.03.1
dar.timestamp=2017-04-12T15:11:02Z

Re: Weiss nicht wie ich suchen soll?

Verfasst: Freitag 6. März 2020, 12:34
von __blackjack__
@Xanthariel: Du musst halt nicht das gesamte Archiv irgendwo auf ein Dateisystem entpacken sondern kannst die Datei "META-INF/dar.info" direkt aus dem ZIP-Archive heraus öffnen.

Es wird `os` importiert aber nicht verwendet‽

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Siehe den Style Guide for Python Code.

Dateien sollte man wo möglich mit der ``with``-Anweisung zusammen öffnen.

Und für Java-Properties gibt es wie gesagt ein Modul das man installieren kann.

Code: Alles auswählen

#!/usr/bin/env python3
from zipfile import ZipFile

from jproperties import Properties


def main():
    with ZipFile("test.zip", "r") as archive:
        with archive.open("META-INF/dar.info") as dar_info_file:
            dar_info = Properties()
            dar_info.load(dar_info_file)

    for key, value in dar_info.items():
        print(key, "->", value.data)


if __name__ == "__main__":
    main()