In eine textdatei Zeilen einfügen

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.
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`.
Cyberbroker
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:

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?
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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)
Cyberbroker
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é
Cyberbroker
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.

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:

Code: Alles auswählen

conditions_out      = open ('Condition.txt','w')
gruß

René
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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:

Code: Alles auswählen

conditions_out      = open ('Condition.txt','w')
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
Cyberbroker
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:

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é
Benutzeravatar
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:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Cyberbroker hat geschrieben:

Code: Alles auswählen

def os.mkdir(a+"\\"+name):
    [...]
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.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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.
Antworten