@Cyberbroker: Das `glob`-Modul wäre ein einfacher Weg die Namen aller ``.txt``-Dateien in einem Verzeichnis zu ermitteln. Im `os.path`-Modul finden sich nützliche Funktionen um Pfade und Dateinamen in ihre Komponenten zu zerlegen und Pfade zusammen zu setzen.
Es mag wichtig sein, dass das erst einmal läuft, aber wenn man nicht übersichtlich programmiert, dann rächt sich das sehr oft, wenn man ein Skript warten und überarbeiten muss. Deshalb solltest Du wirklich die Daten und die Programmlogik trennen und mit einem Template arbeiten. Das kann ruhig erst einmal mit im Quelltext stehen, aber eben nicht abwechselnd Quelltext und Daten, so dass man nicht wirklich auf einen Blick erkennen kann wie das Ergebnis aussehen wird.
Als nächstes solltest Du den Quelltext sinnvoll in Funktionen aufteilen, statt alles monolithisch auf Modulebene zu schreiben. Zum Beispiel eine Funktion, die eine Datei verarbeitet und die Du dann für jede ``*.txt``-Datei aufrufen kannst.
Dateien sollte man mit der ``with``-Anweisung öffnen. Dann ist sicher gestellt, dass sie auch auf jeden Fall geschlossen werden.
Python kennt literale, mehrzeilige Zeichenketten. Damit ist es nicht nötig ``\`` zum fortsetzen von Zeilen zu verwenden und '\n' an die Zeilenenden von diesen mehrzeiligen Literalen zu setzen.
Namen sollte man nicht abkürzen, solange es nicht allgemein bekannte Abkürzungen sind. `Temp` könnte zum Beispiel auch für `temporary` stehen, statt für `temperature`.
In eine textdatei Zeilen einfügen
-
- User
- Beiträge: 16
- Registriert: Dienstag 17. November 2009, 22:18
Danke Blackjack,
werde mir die Tipps aufjedenfall zu herzen nehmen. Das Skript wird sicherlich noch mal general überholt. Aber vorerst muss ich Ende dieser Woche zeigen was es kann^^.
Es kam gestern noch unerwartet noch eine Anforderung dazu.
Es sollen mehrere Temperaturen wie folgt angebeben werden:
So müsste es funktionieren, ausser das temp_i nich durchgehend nummeriert wird. wie kann ich das machn?
werde mir die Tipps aufjedenfall zu herzen nehmen. Das Skript wird sicherlich noch mal general überholt. Aber vorerst muss ich Ende dieser Woche zeigen was es kann^^.
Es kam gestern noch unerwartet noch eine Anforderung dazu.
Es sollen mehrere Temperaturen wie folgt angebeben werden:
Code: Alles auswählen
temperature_min = int(input ('Temperatur_min in Kelvin:') )
temperature_max = int(input ('Temperatur_max in Kelvin:') )
temperature_inkrement = int(input ('Temperatur_inkrement:') )
a= int(((temp_max - temp_min)/temp_ink)+1)
i=0
if temperature_min == temperature_max:
temperatur_liste = [temperature_min]
elif temperature_min < temperature_max:
temperatur_liste = [temperature_min]
while a != i:
temp_i = int(temperature_min+temperature_inkrement)
temperature_liste.append(temp_i)
i += 1
So müsste es funktionieren, ausser das temp_i nich durchgehend nummeriert wird. wie kann ich das machn?
Statt "müsste" solltest du das mal ausprobieren. Du verwendest Bezeichner (temp_max, temp_min) ohne sie vorher deklariert zu haben und versuchst an eine nicht existente Liste (temperature_liste) etwas anzuhängen. Das kann nicht gehen!Cyberbroker hat geschrieben:So müsste es funktionieren, ausser das temp_i nich durchgehend nummeriert wird. wie kann ich das machn?
Zudem ist der Mix aus deutschen und englischen Bezeichnungen gefährlich. Willst du wirklich temperatur_liste und temperature_liste haben?
Du fügst übrigens mehrfach den gleichen Wert zur Liste hinzu. Die Schleife ist ja auch ein wenig umständlich gestaltet, so dass sich solche Fehler einschleichen. a ist definitiv überflüssig.
Code: Alles auswählen
temperatures = []
if temperature_min <= temperature_max:
current_temperature = temperature_min
while current_temperature < temperature_max:
temperatures.append(current_temperature)
current_temperature += temperature_increment
temperatures.append(temperature_max)
else:
# Warnhinweis
pass
print(temperatures)
-
- User
- Beiträge: 16
- Registriert: Dienstag 17. November 2009, 22:18
vielen dank.
ausprobieren wollt ichs erst gar nicht weil mir das mit temp_i klar war, das es nicht funktionieren wird. Die fehlerhafte bezeichnugn "temp_min" etc hab ich vergessen umzu bennnen.
Versuch mich an eure tipps zu halten und deshalb geeignetere Variablen als "temp" zu finden.
Danke für deine Hilfe.
Gruß,
René
ausprobieren wollt ichs erst gar nicht weil mir das mit temp_i klar war, das es nicht funktionieren wird. Die fehlerhafte bezeichnugn "temp_min" etc hab ich vergessen umzu bennnen.
Versuch mich an eure tipps zu halten und deshalb geeignetere Variablen als "temp" zu finden.
Danke für deine Hilfe.
Gruß,
René
-
- User
- Beiträge: 16
- Registriert: Dienstag 17. November 2009, 22:18
Hey,
hab noch eine Frage zum abspeichern von Dateien.
Habe vor die Datei in einem Subfolder zu speichern, dieser Subfolder muss zunächst erstellt werden.
Das erstellen des Ordners klappt.
Hab mir was zum modul os durchgelesen, allerdings nichts dazu gefunden, wie ich Dateien in einem speziellen Ordner abspeichern kann.
Bisher speicher ich einfach nur mittels:
gruß
René
hab noch eine Frage zum abspeichern von Dateien.
Habe vor die Datei in einem Subfolder zu speichern, dieser Subfolder muss zunächst erstellt werden.
Code: Alles auswählen
import os
a = os.getcwd() #
name="Hexan" # wobei der name im eigentlichen Skript dynamisch generiert wird
os.mkdir(a+"\\"+name)
Hab mir was zum modul os durchgelesen, allerdings nichts dazu gefunden, wie ich Dateien in einem speziellen Ordner abspeichern kann.
Bisher speicher ich einfach nur mittels:
Code: Alles auswählen
conditions_out = open ('Condition.txt','w')
René
Für das Zusammenbauen von Dateipfaden gibt es os.path.join(). Das funktioniert dann auch betriebssystemübergreifend.Cyberbroker hat geschrieben:Habe vor die Datei in einem Subfolder zu speichern, dieser Subfolder muss zunächst erstellt werden.
Code: Alles auswählen
foldername = 'Hexan'
path = os.path.join(os.getcwd(), foldername)
print(path)
Gib beim Öffnen den kompletten Pfad zur Datei an. Um den Code von oben mal fortzusetzen:Cyberbroker hat geschrieben:Hab mir was zum modul os durchgelesen, allerdings nichts dazu gefunden, wie ich Dateien in einem speziellen Ordner abspeichern kann.
Bisher speicher ich einfach nur mittels:Code: Alles auswählen
conditions_out = open ('Condition.txt','w')
Code: Alles auswählen
filename = 'Condition.txt'
filepath = os.path.join(path, filename)
with open(filepath, 'w') as conditions_out:
# do something
-
- User
- Beiträge: 16
- Registriert: Dienstag 17. November 2009, 22:18
Danke für die Hilfe. Bin jedes mal aufs neue überrascht wie einfach das mit Python geht.
Zur Exception:
Wenn ich das mit den exceptions richtig verstanden hab - was ich aber wohl nicht hab, da es nicht funktioniert - müsste es so gehen:
Allerdings sagt er mir beim punkt von os.mkdir "Invalid syntax".
Und noch ein andere Frage:
Wie schon erwähnt muss ich eine Liste von Temperaturen in eine .txt Datei schreiben.
Diese liste kann ich aber nicht einfach so in die Datei schreiben, also hab ich die liste in einen String gespeichert:
Und das dann genutzt um den String ohne Klammern [] einzufügen:
Funktionert soweit auch gut, ausser das er mir die Komma mit einfügt
Beispiel:
und die sollen da nicht sein eigentlich nicht haben.
Gruß,
René
Zur Exception:
Wenn ich das mit den exceptions richtig verstanden hab - was ich aber wohl nicht hab, da es nicht funktioniert - müsste es so gehen:
Code: Alles auswählen
def os.mkdir(a+"\\"+name):
try:
return os.mkdir(a+"\\"+name)
except WindowsError:
return print("Ordner existiert bereits. Ordner loeschen; erneut versuchen")
Und noch ein andere Frage:
Wie schon erwähnt muss ich eine Liste von Temperaturen in eine .txt Datei schreiben.
Code: Alles auswählen
temperatures = [temp1,temp2,temp3] # wird im skript dynamisch generiert
Diese liste kann ich aber nicht einfach so in die Datei schreiben, also hab ich die liste in einen String gespeichert:
Code: Alles auswählen
temperatures_string = str(temperatures)
temperature_len = len(temperatures_string)-1
Code: Alles auswählen
conditions_out.write('TemperatureModel: Constant (K) ' +temperatures_string[1:temperature_len] +"\n")
Beispiel:
Code: Alles auswählen
TemperatureModel: Constant (K) 800, 900, 1000, 1100, 1200
Gruß,
René
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Pfade setzt man nicht mittels "+" zusammen, sondern mit `os.path.join`! Wurde das noch nicht erwähnt im Thread? Mir war so...
Und aus einer Liste kommt man per `"".join()` in einen String:
Da Du vermutlich Integerwerte in der Liste stehen hast, musst Du diese noch in Strings wandeln, da die `join`-Methode nur mit Strings arbeitet.
Also ich glaube ehrlich gesagt immer noch, dass Du mit einer Templateengine besser gefahren wärst! Ok, Dir fehlen augenscheinlich noch viele Grundlagen, aber wenigstens wäre das Zusammenbauen der Daten leichter, da eine solche Engine einem das Konvertieren abnimmt und von Haus aus direkt darauf die komfortable Serialisierung von Standarddatentypen ausgelegt ist.
Und aus einer Liste kommt man per `"".join()` in einen String:
Code: Alles auswählen
In [5]: temperatures = [800, 900, 1000, 1100, 1200]
In [6]: print("TemperatureModel: Constant (K) {}".format(" ".join(str(t) for t in temperatures)))
TemperatureModel: Constant (K) 800 900 1000 1100 1200
Also ich glaube ehrlich gesagt immer noch, dass Du mit einer Templateengine besser gefahren wärst! Ok, Dir fehlen augenscheinlich noch viele Grundlagen, aber wenigstens wäre das Zusammenbauen der Daten leichter, da eine solche Engine einem das Konvertieren abnimmt und von Haus aus direkt darauf die komfortable Serialisierung von Standarddatentypen ausgelegt ist.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Die Definition für eine Funktion sagt, dass der Funktionsname ein identifier sein muss. "os.mkdir" ist kein identifier.Cyberbroker hat geschrieben:Code: Alles auswählen
def os.mkdir(a+"\\"+name): [...]
Das was du als Parameter versuchst anzugeben ist auch kein Parameter.
Welches Tutorial verwendest du zum Lernen von Python? Es scheint mir angebracht eine Warnung vor diesem Werk auszusprechen.
"return print" kommt mir ziemlich spanisch vor... Willst du es nicht entweder zurückgeben oder ausgeben und nicht beides?Cyberbroker hat geschrieben:...
Zur Exception:
Wenn ich das mit den exceptions richtig verstanden hab - was ich aber wohl nicht hab, da es nicht funktioniert - müsste es so gehen:
...Code: Alles auswählen
def os.mkdir(a+"\\"+name): try: return os.mkdir(a+"\\"+name) except WindowsError: return print("Ordner existiert bereits. Ordner loeschen; erneut versuchen")
Weiß allerdings nicht wie es bei Python 3.x ist
Bei Python 3 liefert `print()`, zumindest bei Erfolg, `None` zurück. Ist halt nicht sonderlich sinnvoll das zu schreiben.JonasR hat geschrieben:"return print" kommt mir ziemlich spanisch vor... Willst du es nicht entweder zurückgeben oder ausgeben und nicht beides?
Weiß allerdings nicht wie es bei Python 3.x ist