Erstellen JSON Objekt von einer Iteration durch Dateien

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
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Guten Morgen,

ich habe eine Ordnerstruktur, die wie folgt, aus sieht:

Code: Alles auswählen

mainfolder
   - subfolder
     - spkgbuild
Die Datei spkgbuild enthält folgenden Aufbau:

Code: Alles auswählen

# description	: 
# depends	: 

name=
version=
release=1
source=""

build() {

}
Ich habe ein Script geschrieben, das mit ein JSON Objekt erstellen sollte, das ungefähr diesen Aufbau haben:

Code: Alles auswählen

[
   {
      "repo":"mainfolder_name",
      "name":"",
      "version":""
   },
      {
      "repo":"mainfolder_name",
      "name":"",
      "version":""
   },
      {
      "repo":"mainfolder_name",
      "name":"",
      "version":""
   }
]
Jetzt habe ich dieses Skript geschrieben

Code: Alles auswählen

#!/usr/bin/python3

import glob
import json

repo_list = ["core", "multilib", "nonfree", "testing"]
temp_json=[] 
package_name = ''
package_version = ''
for i in repo_list:
    print(i)
    for name in glob.glob('../' + i +'/*/spkgbuild'): 
        package = open(name,'r')
        Lines = package.readlines()
        for line in Lines:
            if(line.strip().startswith('name=')):
                package_name = line.strip()[5:]
            if(line.strip().startswith('version=')):
                package_version = line.strip()[8:]
            if(package_name != '' and package_version != ''):
                temp_json.append({"repo": i,"name": package_name,"version": package_version})
                package_name = ''
                package_version = ''

with open('packages.json', 'w') as outfile:
    json.dump(temp_json, outfile)
Das läuft auch gut, die Datei wird erstellt mit einem ordentlichen JSON Objekt. Das Problem, die Versionsnummer in jedem Objekt passt nicht. Bedeutet, wenn ich jetzt in der Datei den Namen "Firefox" habe mit Version "85.0" dann ist es so als wäre es um eins verrückt, bedeutet, dass die Datei die im nächsten Schleifendurchlauf ist, z. B.: "Firefox-esr" die Versionsnummer "85.0" hat.
Ich finde aber gerade nicht den Fehler in meinem Schleifendurchlauf.
Sirius3
User
Beiträge: 17797
Registriert: Sonntag 21. Oktober 2012, 17:20

`i` ist ein schlechter Name für ein `repository`. Benutze auch keine Abkürzungen, repositories ist viel lesbarer als repo_list. Und warum nennst Du Dein Ergebnis temp_json? Was hat das mit Temperatur zu tun?
Variablennamen werden generell klein geschrieben. Die Variable Lines ist auch überflüssig, da man direkt über das file-Objekt iterieren könnte. Dateien öffnet man mit dem with-Statement.
if ist keine Funktion, die Klammern daher unnötig. Pfade setzt man nicht mit + zusammen, sondern benutzt am besten pathlib.Path.
Die if-Abfrage nach package_name und package_version ist schlecht, da wenn eine Datei z.B. kein `name=` hat, deine ganzen Daten durcheinander geraten. Am besten schreibst Du eine eigene Funktion, die eine spkg-build-Datei liest.

Code: Alles auswählen

import json
from pathlib import Path

BASEPATH = Path('..')
REPOSITORIES = ["core", "multilib", "nonfree", "testing"]

def read_spkgbuild(filepath):
    result = {}
    with filepath.open(encoding="ASCII") as lines:
        for line in lines:
            key, eq, value = line.strip().partition('=')
            if eq and key in ['name', 'version']:
                result[key] = value
    return result

def main():
    packages = []
    for repository in REPOSITORIES:
        print(repository)
        for filepath in (BASEPATH / repository).glob('*/spkgbuild'):
            info = read_spkgbuild(filepath)
            info["repo"] = repository
            packages.append(info)

    with open('packages.json', 'w') as outfile:
        json.dump(packages, outfile)

if __name__ == "__main__":
    main()
Antworten