Das Ding des Jahres

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.
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Mittwoch 25. März 2020, 20:30

111
Zuletzt geändert von fox1203 am Mittwoch 25. März 2020, 20:59, insgesamt 1-mal geändert.
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Mittwoch 25. März 2020, 20:44

Den Vergleich mit dem Boot finde ich gut, danke für die Inspiration.
__deets__
User
Beiträge: 7656
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 25. März 2020, 21:02

__blackjack__ hat geschrieben:
Mittwoch 25. März 2020, 20:23
Das `readlines()` würde ich noch weg lassen.
🤦‍♂️ Joa. Wohl war.
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 10:43

Die Werte werden nun so dargestellt wie ich mir das so vorstelle, danke für die Hilfe.

Als nächsten Step habe ich anstelle "w" bei open "a" angeführt, sodass bei jeder neuen Iteration die zugehörig neuen Werte in eine neue Zeile geschrieben werden. Das funktioniert grundsätzlich, jedoch wird hierbei immer eine Zeile frei gelassen. Am Ende der letzten Datenreihe sind keine Leerzeichen oder Tabs, das gleiche gilt für die nächste leere Zeile. Lösche ich diese nächstkommende leere Zeile allerdings manuell, dann werden mir bei erneuten aufrufen des Skript die neuen Werte direkt in der nächsten Zeile eingefügt.

Da ich mit den Funktionen def etc. nicht rudern konnte sieht der Code nach mehrmaligen try and error versuchen wie folgt aus:

Code: Alles auswählen

import csv
import sys



#Einlesen der FE Ergebnisse
#Überführen der Input Werte und Ergebnisse in eine TXT Datei
with open("gesamt.txt", "w") as output:
    with open("input_manuell.txt") as lines:
        output.writelines(lines)
    with open("input_iteration.txt") as lines:
        output.writelines(lines)
    with open("data.txt") as lines:
        output.writelines(lines)


#Öffnen der CSV Sammeldatei und Schreiben der gesamt.txt Werte
with open("gesamt.csv", "a") as csv_gesamt:
    #reader = csv.reader(csv_gesamt, delimiter='\n')
    writer = csv.writer(csv_gesamt, sys.stdout, delimiter='\t')
    with open("gesamt.txt") as lines:
        lines = [line.strip() for line in lines if line.strip()]
        writer.writerow(lines)


Für Hinweise wäre ich sehr dankbar. --> Rechtschreibung überprüft durch unabhängigen Sachverständigen
Sirius3
User
Beiträge: 11566
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 26. März 2020, 11:21

Die selben Daten gleich wieder zu lesen, die man eben erst geschrieben hat, ist nicht so toll, das kann man in einem Schritt machen:

Code: Alles auswählen

all_lines = []
for filename in ["input_manuell.txt", "input_iteration.txt", "data.txt"]:
    with open(filename) as lines:
        all_lines.extend(lines)

with open("gesamt.txt", "w") as output:
    output.writelines(all_lines)

stripped_lines =  [line.strip() for line in all_lines if line.strip()]
with open("gesamt.csv", "a") as csv_gesamt:
    writer = csv.writer(csv_gesamt, sys.stdout, delimiter='\t')
    writer.writerow(stripped_lines)
Warum da eine Leerzeile kommt, kann man aus dem Code nicht sehen. Kannst Du hier den Inhalt der geschriebenen Listen posten?
Benutzeravatar
__blackjack__
User
Beiträge: 5458
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 26. März 2020, 11:51

@fox1203: Warum wird bei `writer()` als zweites Argument `sys.stdout` übergeben? Das macht so gar keinen Sinn.

Verwendest Du etwa noch Python 2? Dann solltest Du *jetzt* auf Python 3 wechseln, denn 2 wird nicht mehr supported.

Ansonsten: Wie stellst Du denn fest das da Leerzeilen sind? In CSV-Dateien werden Datensätze mit "\r\n" abgeschlossen statt nur mit "\n". Es kann also auch sein, dass Dir das Programm das Du zum ansehen der Datei verwendest einen Streich spielt.

Edit: Ups, beim `open()` fehlt das ``newline=""``-Argument wenn das Python 3 ist.
long long ago; /* in a galaxy far far away */
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 12:02

So nun Schritt für Schritt.

Mit dem Code @sirius3 komme ich auf die gleichen Ergebnisse leider, der sieht aber für mich als LAIE cooler aus als meiner, darum habe ich ihn übernommen. Habe nun alle Dateien auf eine Cloud gepackt, hoffe Ihr seht den Link nachstehend:

[url]https://veruspraedium-my.sharepoint.com ... 1nHbzd[url]

@blackjack: Ich verwende Python 3.8, installiert auf Windows 10 über die python.org Seite. Zu den Leerzeichen: Da habe ich die CSV Datei mit Microsoft Excel 365 geöffnet und in der jeweiligen Zeile nachgesehen, kann durchaus sein, dass Excel da etwas ausblendet...


Könnt Ihr die von mir freigegebenen Daten einsehen?
Benutzeravatar
__blackjack__
User
Beiträge: 5458
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 26. März 2020, 12:09

@fox1203: Wie gesagt, das `sys.stdout` beim `writer()`-Aufruf gehört da nicht hin, und die Dateien die mit dem CSV-Modul verwendet werden brauchen ``newline=""`` als zusätzliches Argument, sonst passiert mindestens unter Windows das was Du da siehst.
long long ago; /* in a galaxy far far away */
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 12:11

Die beiden txt files bezeichnet mit imput_ sind dann für das exe Programm erforderlich.

Iteriert sollen in weiterer folge am Beispiel der Datei Input_manuell.txt:
1. Wert von 0,8 bis 4,5 in 0,05 Schritten
2. Wert von 50 bis 950 in 10 Schritten

Was bedeutet:
1. Wert 0,8; 2. Wert 50
1. Wert 0,8; 2. Wert 60
1. Wert 0,8; 2. Wert 70
usw. bis
1. Wert 0,8; 2. Wert 950

Dannach:
1. Wert 0,85; 2. Wert 50
usw.

Im 2. txt File Input_iteration befinden sich dann auch noch Werte die entsprechend gleichzeitig zu iterieren sind. In Summe sollen dabei wie gesagt ca. 250.000 Iterationsläufe durchfahren werden. Nach jeder Anpassung der Input Werte natürlich das Exe File starten und die Werte mit dem bereits in Entwicklung befindlichen Code in das CSV, samt den Input Werten, schreiben.
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 12:19

perfekt, danke Blackjack, habe den Code wie folgt geändert, nun schreibt er in jede Zeile! Top!

Code: Alles auswählen

import csv
import sys






all_lines = []
for filename in ["input_manuell.txt", "input_iteration.txt", "data.txt"]:
    with open(filename) as lines:
        all_lines.extend(lines)

with open("gesamt.txt", "w") as output:
    output.writelines(all_lines)

stripped_lines =  [line.strip() for line in all_lines if line.strip()]
with open("gesamt.csv", "a", newline='') as csv_gesamt:
    writer = csv.writer(csv_gesamt, delimiter='\t')
    writer.writerow(stripped_lines)
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 13:46

So, nun arbeite ich an der Iteration der Input Wert, wobei ich zunächst mal die Ergebnisse nur als Print() darstellen möchte, um zu sehen ob die Funktionen auch das tun was sie sollen. Zunächst habe ich 3 Parameter festgelegt und folgendes Skript erstellt:

Code: Alles auswählen

#Input Werte für exe Programm und input_manuell.txt
i1 = 0.8 #Startwert für Durchmesser
i11 = 4.5 #Stoppwert für Durchmesser
d1 = 0.05 #Iterationsschritte Durchmesser

i2 = 80 #Startwert für Zementgehalt
i22 = 950 #Stoppwert für Zementgehalt
d2 = 10 #Iterationsschritte Zementgehalt

i3 = 1 #Startwert fiktiver Wert
i33 = 10 #Stoppwert fiktiver Wert
d3 = 1 # Iterationsschritte fiktiver Wert



durchmesser = i1-d1
zementgehalt = i2-d2


while durchmesser < i11:
    durchmesser = round(durchmesser + d1,2)
    zementgehalt = i2
    iteration = i3
    print(durchmesser, '\t', zementgehalt, '\t', iteration)

Dannach habe ich noch die Funktion range() entdeckt, welche ja genau das abbildet, was ich mühsam mit je drei Variablen getan habe.

Meine Frage, wenn ich zB folgende Formeln definiere:
durchmesser = range(0.8,4.5,0.05)
zementgehalt = range(80,950,10)
fiktiv = range(1,10,1)
Ist es möglich diese Variablen mit Unter-, Obergrenze und Schrittweite in einfacher Art und Weise miteinander kombinieren zu lassen, sowie die Zwischenergebnisse als print() zur Kontrolle darstellen zu lassen? Hat da jemand Erfahrungen damit??
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 15:10

Die Funktion range() arbeitet nur mit Ganzzahlen, habe jedoch eine Möglichkeit gefunden diese mit Gleitkommazahlen zu nutzen Code siehe untenstehend:

Code: Alles auswählen

def f_range(von=0, bis=None, schritt=1):
    if bis is None:
        von, bis = 0, von
    f = von
    if schritt > 0:
        while f < bis:
            yield(f)
            f += schritt
    else:
        while f > bis:
            yield(f)
            f += schritt

for x in f_range(0.8,4.5,0.05):
    print(round(x,2))
Falls dies wer auch noch brauchen kann....

Die Frage besteht jedoch, ob wer eine einfache Art und Weise hat wie man mehreren range() Funktionen Parametersets ausrechnen lassen kann??
Sirius3
User
Beiträge: 11566
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 26. März 2020, 15:13

Welche Art von Kombination hast Du Dir denn vorgestellt?
`range` funktioniert nur mit ganzen Zahlenwerten. Für floats gibt es numpy.arange oder gleich numpy.linspace.
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 15:40

Im Grunde genommen wie schon oben beschrieben:

Iteriert sollen in weiterer folge am Beispiel der Datei Input_manuell.txt:
1. Wert von 0,8 bis 4,5 in 0,05 Schritten
2. Wert von 50 bis 950 in 10 Schritten

Was bedeutet:
1. Wert 0,8; 2. Wert 50
1. Wert 0,8; 2. Wert 60
1. Wert 0,8; 2. Wert 70
usw. bis
1. Wert 0,8; 2. Wert 950

Dannach:
1. Wert 0,85; 2. Wert 50
usw.

Ich bin auf das Modul "itertools" gestoßen, das scheint zumindest das zu tun was ich im Grunde möchte und zwar eine Permutation.

Habe dafür folgenden Code erstellt:

Code: Alles auswählen

import itertools


def f_range(von=0, bis=None, schritt=1):
    if bis is None:
        von, bis = 0, von
    f = von
    if schritt > 0:
        while f < bis:
            yield(f)
            f += schritt
    else:
        while f > bis:
            yield(f)
            f += schritt


#Input Werte für exe Programm und input_manuell.txt
i1 = 0.8 #Startwert für Durchmesser
i11 = 4.5 #Stoppwert für Durchmesser
d1 = 0.05 #Iterationsschritte Durchmesser

i2 = 80 #Startwert für Zementgehalt
i22 = 950 #Stoppwert für Zementgehalt
d2 = 10 #Iterationsschritte Zementgehalt

i3 = 1000 #Startwert fiktiver Wert
i33 = 1010 #Stoppwert fiktiver Wert
d3 = 1 # Iterationsschritte fiktiver Wert


#Erstellung von Listen entsprechend den Iterationswerten
durchmesser = list(f_range(i1,i11,d1))
print(durchmesser)
zementgehalt = list(f_range(i2,i22,d2))
print(zementgehalt)

#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations([1,2,3,4],2)))
print("Test1")

#Test für den Plot meiner Daten
print(list(itertools.permutations([f_range(i1,i11,d1)],2)))
print("erledigt")

iteration = itertools.permutations([durchmesser], [zementgehalt])


Also die Art und Weise dieser Funktion passt schon mal, er kann auch Listen bearbeiten wenn diese in einer [] stehen. Jedoch scheint die Funktion es nicht zu schaffen eine Formel als Liste zu erkennen.

Noch dazu sollte ja nach jedem Wertepaar das Exe File starten und die Ergebnisse daraus ins CSV fließen, das ist noch unklar ob ich das mit der Funktion itertools schaffe, oder ob ich da ein neues TXT file erstellen muss mit all den Wertepaaren, auf dieses könnte ich dann später nochmal zugreifen wenn es darum geht die Input Werte für meine exe Datei zu schreiben...

Fragen über Fragen....
fox1203
User
Beiträge: 22
Registriert: Montag 23. März 2020, 15:19

Donnerstag 26. März 2020, 15:50

Also die Permutation Funktion erkennt auf alle Fälle die range() Funktion s. am Beispiel Code:

Code: Alles auswählen

#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations(range(1,10,1),2)))
print("Test2")
Natürlich muss man da noch import itertools hinzufügen.

Die mit der selbst gebastelten Funktion kann itertools offensichtlich nichts anfangen, any ideas how to solve that??
Antworten