Seite 1 von 2
Re: In eine textdatei Zeilen einfügen
Verfasst: Sonntag 22. Januar 2012, 18:37
von BlackJack
@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`.
Re: In eine textdatei Zeilen einfügen
Verfasst: Dienstag 24. Januar 2012, 13:44
von Cyberbroker
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:
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?
Re: In eine textdatei Zeilen einfügen
Verfasst: Dienstag 24. Januar 2012, 14:19
von /me
Cyberbroker hat geschrieben: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!
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)
Re: In eine textdatei Zeilen einfügen
Verfasst: Dienstag 24. Januar 2012, 15:41
von Cyberbroker
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é
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 00:04
von Cyberbroker
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.
Code: Alles auswählen
import os
a = os.getcwd() #
name="Hexan" # wobei der name im eigentlichen Skript dynamisch generiert wird
os.mkdir(a+"\\"+name)
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é
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 00:26
von /me
Cyberbroker hat geschrieben:Habe vor die Datei in einem Subfolder zu speichern, dieser Subfolder muss zunächst erstellt werden.
Für das Zusammenbauen von Dateipfaden gibt es
os.path.join(). Das funktioniert dann auch betriebssystemübergreifend.
Code: Alles auswählen
foldername = 'Hexan'
path = os.path.join(os.getcwd(), foldername)
print(path)
Bei der Verwendung von os.mkdir() bitte nicht vergessen die Exception abzufangen die geworfen wird, wenn der Ordner bereits existiert oder nicht erstellt werden kann.
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:
Gib beim Öffnen den kompletten Pfad zur Datei an. Um den Code von oben mal fortzusetzen:
Code: Alles auswählen
filename = 'Condition.txt'
filepath = os.path.join(path, filename)
with open(filepath, 'w') as conditions_out:
# do something
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 11:09
von Cyberbroker
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:
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")
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.
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
Und das dann genutzt um den String ohne Klammern [] einzufügen:
Code: Alles auswählen
conditions_out.write('TemperatureModel: Constant (K) ' +temperatures_string[1:temperature_len] +"\n")
Funktionert soweit auch gut, ausser das er mir die Komma mit einfügt
Beispiel:
Code: Alles auswählen
TemperatureModel: Constant (K) 800, 900, 1000, 1100, 1200
und die sollen da nicht sein eigentlich nicht haben.
Gruß,
René
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 11:36
von Hyperion
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:
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
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.
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 14:01
von /me
Cyberbroker hat geschrieben:
Die
Definition für eine Funktion sagt, dass der Funktionsname ein
identifier sein muss. "os.mkdir" ist kein
identifier.
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.
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 14:21
von JonasR
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")
...
"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
Re: In eine textdatei Zeilen einfügen
Verfasst: Mittwoch 25. Januar 2012, 14:51
von nomnom
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
Bei Python 3 liefert `print()`, zumindest bei Erfolg, `None` zurück. Ist halt nicht sonderlich sinnvoll das zu schreiben.