Werte aus 2 Listen in eine .txt schreiben

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
Enne1008
User
Beiträge: 6
Registriert: Montag 2. September 2019, 11:49

Hallo,

ich möchte mich aus beruflichen Gründen nun mit Python 3 beschäftigen. Die ersten "Spielerein" haben mich zum Weitermachen ermutigt. Leider bin ich nun auf eine Herausforderung gestoßen, welche mich sehr beschäftigt, da ich den Grund nicht erkenne.

Ich möchte, dass Werte aus 2 Listen in eine Datei geschrieben werden. leider tauchen in der Datei stets die jeweils letzten Einträge aus den Listen auf, der Rest fehlt.

Meine Idee sieht wie folgt aus:

Code: Alles auswählen

b2=[]
b1=[]
with open ("ca.txt","r") as file_2: # Holen der Daten aus der 2. Datei und in eine Liste_2
    for line in file_2:
        b2.append(line+"\n")
    
#for line in b2:
    #print(line.strip())
    
    
with open ("inhalt.txt", "r") as file_1: # Holen der Daten aus der 1. Datei und in eine Liste_1
    for line in file_1:
        b1.append(line+"\n")
    
#for line in b1:
    #print(line.strip())

for i in b2:
    print(i.strip())
    
for j in b1:
    print(j.strip())
    
with open ("nu_aber.txt","w") as file_n:
    file_n.write(i.strip())+file_n.write(j.strip())
Woran liegt das? Und wie kann ich dies so gestalten, dass sämtlich Einträge angezeigt werden?

Besten Dank bereits vorab
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

i und j verweisen nach dem Durchlaufen der beiden Schleifen auf das jeweils letzte Element der jeweiligen Listen. Und nur diese beiden Elemente sicherst Du anschließend.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

#edit: Verlesen, sry
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Enne1008: Zwischen Funktionsname und öffnender Klammer vom Aufruf gehört kein Leerzeichen. Dafür erhöhen Leerzeichen nach Kommas und um binäre Operatoren und dem Gleichheitszeichen bei Zuweisungen ausserhalb von Argumentlisten die Lesbarkeit.

Das ist erst die Daten aus einer ”zweiten” Datei in eine ”zweite” Liste und dann die Daten aus einer ”ersten” Datei in eine ”erste” Liste gelesen werden ist verwirrend. Überhaupt sollte man keine Namen durchnummerieren. Und weder nicht allgemein bekannte Abkürzungen noch einbuchstabige Namen verwenden die nicht geläufig sind. Also `x` und `y` für Koordinaten ist okay, `i` und `j` für ganzzahlige Laufvariablen und Indexwerte auch, aber `i` und `j` für etwas anderes als ganze Zahlen geht dann schon nicht mehr, weil das den Leser verwirrt. Und `b1` und `b2` für Listen mit Zeilen aus Dateien ist total undurchsichtig. Namen sollen dem Leser verraten was der Wert dahinter im Kontext des Programms bedeutet.

Zeilen aus einer Datei haben bereits ein Zeilenende – da noch ein weiteres dran zu hängen, wenn dann später beide sowieso mit `strip()` wieder entfernt werden, macht wenig bis keinen Sinn. Da sollte man besser beim einlesen schon `strip()` anwenden.

Wenn man Textdateien öffnet, sollte man immer explizit die Kodierung angeben.

Beim einlesen bietet sich eine „list comprehension“ statt einer ``for``-Schleife an.

Du hast Glück das `file.write()` eine Zahl zurückgibt und nicht `None`, sonst hätte das mit dem Addieren beim Schreiben nicht funktioniert. Es macht aber auch so keinerlei Sinn.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    with open("ca.txt", "r", encoding="ascii") as file:
        ca_lines = [line.strip() for line in file]

    with open("inhalt.txt", "r", encoding="ascii") as file:
        content_lines = [line.strip() for line in file]

    for line in ca_lines:
        print(line)

    for line in content_lines:
        print(line)

    with open("nu_aber.txt", "w", encoding="ascii") as file:
        file.writelines(
            f"{ca_line} {content_line}\n"
            for ca_line, content_line in zip(ca_lines, content_lines)
        )


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Enne1008
User
Beiträge: 6
Registriert: Montag 2. September 2019, 11:49

@_blackjack_: vielen Dank für deine konstruktiven Hinweise bzw. für deine Kritik. Dein Code gibt genau das aus, worum es mit ging.
Antworten