Python zwei kleine Codeteile zusammenknüpfen

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
Alonso77
User
Beiträge: 3
Registriert: Freitag 4. März 2016, 10:44

Freitag 4. März 2016, 11:02

Hallo Leute,

ich brauche eure Hilfe, weil ich Anfänger bin.Ich habe hier ein Code, der nicht optimal ist. Denn hier zweimal LESE und SCHREIBE Operation benutzt wird. Ich konnte das nicht verknüpfen. Kann mir jemand helfen? Ich brauche, dass die set() Operation im ersten Teil des Codes eingebaut wird. Danke im Voraus

Code: Alles auswählen

#!/usr/bin/python

# Ausgabedatei zum beschreiben öffnen
fout = open('outputfile.txt', 'w')

# Variable die die parts sammelt
parts = []

# für jede Zeile der Eingabedatei
with open('inputfile.txt','r') as f:
for l in f:
                # wenn der String 'part' in der Zeile gefunden wird dann schreibe die Zeile in das Array
		if 'part' in l:
			parts.append(l.replace('\n',''))
		else:
                        # wenn die Zeile kein 'part' mehr enthält und das Array nicht leer ist dann schreibe die Elemente wie gewünscht in die Ausgabedatei
			if parts != []:
				fout.write('D:\Temp\c_run_multiple_shell_skripts.sh\n')
				fout.write('-S "' + ','.join(parts) + '"\n')
				fout.write('-F ' + l)
                                # Array Variable leeren für nächste Part-Liste
				parts = []
			else:
                                # normale Zeile, einfach in Zieldatei schreiben
				fout.write(l)

fout.close()

lines = open(Input.txt", 'r').readlines()
lines_set = set(lines)

fout = Output.txt'
out  = open(fout, 'w')

for line in lines_set:
    out.write(line + '\n')
Sirius3
User
Beiträge: 7586
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 4. März 2016, 11:32

@Alonso77: wenn Du Code postest, sollte der wenigstens ohne Syntaxfehler sein. Es fehlen Anführungszeichen und die Einrückung ist kaputt. Einbuchstabige Variablennamen sind immer schlecht, da sie keine Information enthalten, für was sie benutzt werden. Auch die Ausgabedatei sollte mit with geöffnet werden, statt replace wäre hier rstrip besser, auf nicht-leere Listen prüft man am einfachsten mit "if parts:", Strings stückelt man nicht mit + zusammen sondern benutzt .format; Kommentare sollten aussagen, warum etwas gemacht wird und nicht nur das wiederholen, was sowieso schon im Code steht.

Die beiden "Programmteile" haben doch überhaupt nichts miteinander zu tun, was soll man da also zusammenfassen?
Alonso77
User
Beiträge: 3
Registriert: Freitag 4. März 2016, 10:44

Freitag 4. März 2016, 12:11

Danke für dein Feedback erstmal. Doch, der erste Teil gibt ein File zurück, wo die dopplelte Werten enthalten sind. Deswegen lese ich im zweiten Teil die Liste, was vom ersten Code geschrieben wurde, und lösche ich mit set() doppelte Zeilen, dann schreibe ich wieder. Und das alles möchte ich in einem Schritt machen. Anstatt zweimal lesen und schreiben
BlackJack

Freitag 4. März 2016, 12:50

@Alonso77: Der erste Teil schreibt eine Datei und der zweite Datei liest eine Datei *mit einem anderen Namen als der erste Teil schreibt*. Die beiden Teile haben also so wie Du sie zeigst nichts miteinander zu tun.

Du möchtest die Daten also nicht in einer Liste sondern in einer Menge sammeln. Na dann mach doch genau das im ersten Teil einfach. Wo ist das konkrete Problem?
Alonso77
User
Beiträge: 3
Registriert: Freitag 4. März 2016, 10:44

Freitag 4. März 2016, 18:31

ok Leute, dann fange ich von vorne an. Das ist mein Input File:

cc_oo_g_csss.sh
cc_oo_guv_zppp.sh
cc_aba_ddd.sh
cc_aba_ccxyp.sh
cc_abus_pl_fa_part1.sh
cc_abus_pl_fa_part2.sh
cc_abus_pl_fa_part3.sh
cc_abus_pl_fa_part4.sh
cc_abus_pl_fa_part5.sh
cc_abus_pl_fa_part6.sh
cc_abus_pl_fa_part7.sh
cc_abus_pl_fa_part8.sh
cc_abus_pl_fa_merge.sh
cc_abac_nsv_ssd.sh
cc_abac_kriv.sh
cc_rufrep_nia_inst_leg.sh
cc_rufrep_nia_inst_comb.sh
cc_rufrep_nia_inst_flow.sh
cc_rufrep_nia_inst.sh
cc_vision_kriv.sh
cc_vision_interface_part1.sh
cc_vision_interface_part2.sh
cc_vision_interface_part3.sh
cc_vision_interface_part4.sh
cc_vision_interface_merge.sh
cc_vision_deriv.sh
cc_vision_deriv.sh
cc_vision_deriv.sh
cc_ria_flows_rep_plain.sh
cc_iaed_fls_rep_merge.sh
cc_vision_interface_part1.sh
cc_vision_interface_part2.sh
cc_vision_interface_part3.sh
cc_vision_interface_part4.sh
cc_vision_interface_merge.sh

Und hier gibt es doppelte Einträge. Mit den ersten Code mache ich so eine Liste:


cc_oo_g_csss.sh
cc_oo_guv_zppp.sh
cc_aba_ddd.sh
cc_aba_ccxyp.sh
D:\Temp\c_run_multiple_shell_skripts.sh
-S "cc_abus_pl_fauz_part1.sh, cc_abus_pl_fa_part2.sh, cc_abus_pl_fa_part3.sh, cc_abus_pl_fa_part4.sh,
cc_abus_pl_fa_part5.sh, cc_abus_pl_fa_part6.sh, cc_abus_pl_fa_part7.sh, cc_abus_pl_fa_part8.sh "
-F cc_abus_pl_fa_merge.sh
cc_abac_nsv_ssd.sh
cc_abac_kriv.sh
cc_rufrep_nia_inst_leg.sh
cc_rufrep_nia_inst_comb.sh
cc_rufrep_nia_inst_flow.sh
cc_rufrep_nia_inst.sh
cc_vision_kriv.sh
D:\Temp\c_run_multiple_shell_skripts.sh
-S "cc_vision_interface_part1.sh, cc_vision_interface_part2.sh, cc_vision_interface_part3.sh,
cc_vision_interface_part4.sh"
-F cc_vision_interface_merge.sh
cc_vision_deriv.sh
cc_vision_deriv.sh
cc_vision_deriv.sh
cc_ria_flows_rep_plain.sh
cc_iaed_fls_rep_merge.sh
D:\Temp\c_run_multiple_shell_skripts.sh
-S "cc_vision_interface_part1.sh, cc_vision_interface_part2.sh, cc_vision_interface_part3.sh,
cc_vision_interface_part4.sh"
-F cc_vision_interface_merge.sh

Code: Alles auswählen

#!/usr/bin/python

# Ausgabedatei zum beschreiben öffnen
fout = open('outputfile.txt', 'w')

# Variable die die parts sammelt
parts = []

# für jede Zeile der Eingabedatei
with open('inputfile.txt','r') as f:
for l in f:
                # wenn der String 'part' in der Zeile gefunden wird dann schreibe die Zeile in das Array
      if 'part' in l:
         parts.append(l.replace('\n',''))
      else:
                        # wenn die Zeile kein 'part' mehr enthält und das Array nicht leer ist dann schreibe die Elemente wie gewünscht in die Ausgabedatei
         if parts != []:
            fout.write('D:\Temp\c_run_multiple_shell_skripts.sh\n')
            fout.write('-S "' + ','.join(parts) + '"\n')
            fout.write('-F ' + l)
                                # Array Variable leeren für nächste Part-Liste
            parts = []
         else:
                                # normale Zeile, einfach in Zieldatei schreiben
            fout.write(l)

fout.close()


lines = open('outputfile.txt', 'r').readlines()
lines_set = set(lines)

fout = "Output_2.txt"
out  = open(fout, 'w')

for line in lines_set:
    out.write(line + '\n')

BlackJack

Freitag 4. März 2016, 19:46

@Alonso77: Das funktioniert so nicht, also auch nicht in den Einzelschritten. Denn in der Ausgabe sind 1. ja auch mehrfach vorkommende Zeilen die *nicht* ausgefiltert werden sollen (``D:\Temp\c_run_multiple_shell_skripts.sh``) und 2. haben Mengen keine Ordnung, die Reihenfolge soll doch aber sicherlich erhalten bleiben. Man würde also eher die mehrfach vorkommenden Zeilen aus der ersten Eingabe heraus filtern wollen. Spart dann auch Zeit beim Verarbeiten.

Die übliche Vorgehensweise ist bei der Programmierung ein Problem auf kleinerer Teilprobleme herunter zu brechen. Und diese Teilprobleme dann auch wieder in kleinere Teilprobleme zu zerlegen. Solange bis man Teilprobleme hat, die mit einer Funktion mit wenigen Zeilen Code zu lösen sind. Diese Teillösungen kann man dann testen und wenn sie funktionieren zu grösseren Teillösungen zusammen setzen. Und das wiederholt man bis man das gesamte Problem gelöst hat.

Man könnte hier also eine Funktion gebrauchen die eine Datei einliest und die Zeilen liefert. Dann eine Funktion die Zeilen bekommt und Zeilen ohne Wiederholungen von Zeilen liefert. Dann eine Funktion die Zeilen bekommt und Zeilen liefert bei denen das mit den 'part's gemacht wird. Dann eine Funktion die Zeilen bekommt und die in eine Datei schreibt. Zu guter Letzt, dann eine Hauptfunktion die all diese Funktionen verwendet um das Gesamtproblem zu lösen.

Auf Modulebene sollten keine Variablen und kein Code stehen der nicht Konstanten, Funktionen, oder Klassen definiert.

Und tu dringend etwas gegen die schlechten Namen. Keine kryptischen Abkürzungen und schon gar keine einbuchstabige Namen für komplexere Werte wenn der Gültigkeitsbereich nicht *sehr* eingeschränkt ist.

Statt immer mit kompletten Listen von Zeilen zu arbeiten, bieten sich in Python Generatorfunktionen an.
Antworten