Seite 2 von 2

Re: Allgemeines Vorgehen - Dictionary?

Verfasst: Dienstag 18. Februar 2020, 12:03
von Sirius3

Code: Alles auswählen

if line.endswith('_end'):
    break

Re: Allgemeines Vorgehen - Dictionary?

Verfasst: Dienstag 18. Februar 2020, 12:16
von sparrow
@Camu: Du iterierst über die Zeilen und rufst dann für jede Zeile csv.reader für die ganze Datei auf. Das ist so nicht richtig.
Du prüfst in jeder Zeile ob "part1" darin steht. Ich würde sagen, dass ist bei allen außer 2 Zeilen immer falsch. Und die beiden Zeilen enthalten keine Werte sondern nur ein part1_begin und ein part1_end.

Teil das Problem in Funktionen auf weil das Vorgehen für part1 und part2 identisch ist. Das lässt sich also in einer Funktion kapseln.

Alternativ musst du dir den Zustand merken. Oh, "part1" kommt vorbei, dann bin ich jetzt in dem Bereich und weiß, wie ich auf die Zeilen reagieren muss, bis _end kommt.

Re: Allgemeines Vorgehen - Dictionary?

Verfasst: Dienstag 18. Februar 2020, 14:53
von Camu
Das wäre dann erstmal der Teil für einen Part. Auch wenn das Update wohl noch so falsch ist (wie hier jemand sagte) - aber momentan weiß ich da keine andere Lösung. Ist das dann der richtige Weg?

Code: Alles auswählen

_file_part = None

d = {}

with open ('test1a.csv', 'r') as csvfile:
    for line in csvfile:
        line = line.rstrip("\n").rstrip(";")
        if line.endswith("part1_begin"):
            _file_part = line
        elif line.endswith("part1_end"):
            break
        else:
            key, values = line.split(";")
            d.update({key: values})
Müsste dann eigentlich ja "nur" den part1_begin und part1_end und Dictionary über eine Funktion ansprechen / austauschen und hätte das ganze dann für die ersten beiden Teile? Oder sollte man das auch anders machen?

Re: Allgemeines Vorgehen - Dictionary?

Verfasst: Dienstag 18. Februar 2020, 15:35
von Sirius3
`file_part` wird gar nicht gebraucht. `d` ist ein sehr schlechter Variablenname. Und statt ein Wörterbuch mit einem Eintrag zu erzeugen um ein anderes upzudaten, solltest Du einfach den Key setzen.

Code: Alles auswählen

part1_key_values = {} # find a better way.

with open ('test1a.csv', encoding="ASCII") as csvfile:
    for line in csvfile:
        line = line.rstrip().rstrip(";")
        if line.endswith("part1_begin"):
            pass
        elif line.endswith("part1_end"):
            break
        else:
            key, value = line.split(";")
            part1_key_values[key] = value

Re: Allgemeines Vorgehen - Dictionary?

Verfasst: Dienstag 18. Februar 2020, 19:21
von Camu
Vielen Dank für die Hilfe. Wie empfohlen wurde habe ich das ganze in eine Funktion versucht zu packen. Die Parameter für begin und end kann ich ohne Probleme übergeben. Auch bekomme ich da ein Dictionary als Return. Nun wollte ich natürlich auch gern das Dictionary noch benennen, also in der Funktion den Name dafür mit übergeben.

Code: Alles auswählen

def part1(csvtodict, begin, end):
    with open ('test1a.csv', encoding="ASCII") as csvfile:
        csvtodict = {}
        for line in csvfile:
            line = line.rstrip().rstrip(";")
            if line.endswith(begin):
                pass
            elif line.endswith(end):
                break
            else:
                key, value = line.split(";")
                csvtodict[key] = value
                #print(key)
            return csvtodict

part1('part1', 'part1_begin', 'part1_end')
Leider ist hier dann man Dictionary leer wenn ich es zurückbekomme. Hab mir das ganze auch mal Schritt für Schritt angeschaut. Begin und end werden "ersetzt" durch part1_begin und part1_end. csvtodict wird aber nicht durch part1 ersetzt. csvtodict wird in for Schleife mit den Werten gefüllt. Wo ist mein Fehler, denke mal das liegt an Global und nicht Global.

Re: Allgemeines Vorgehen - Dictionary?

Verfasst: Dienstag 18. Februar 2020, 19:33
von Sirius3
So funktioniert das nicht, 'part1' ist ein String, der aber in der Funktion gar nicht benutzt wird, sondern sofort durch ein Wörterbuch ersetzt wird. Du mußt schon den Rückgabewert an eine Variable binden.
Das `return` ist auch falsch eingerückt. `part1` ist auch ein schlechter Name für eine Funktion, weil eine Funktion eine Tätigkeit beschreiben sollte. Außerdem sollte die selbe Funktion ja auch für part2 genutzt werden. `csvtodict` ist auch ein schlechter Name, weil es doch gar keine Rolle spielt, dass die Information in dem Wörterbuch mal in einer csv-Datei steckte, sondern für was das denn genutzt werden soll.