Hilfe bei Skript

Code-Stücke können hier veröffentlicht werden.
Antworten
Santana
User
Beiträge: 1
Registriert: Sonntag 29. November 2020, 14:42

Sonntag 29. November 2020, 14:52

Hallo ich bräuchte dringend hilfe bei einer Uni Aufgabe. Ich bin leider kompletter Programmier Neuling. Es geht um das folgende Programm:

# Beginn der Funktion index_von_variable

def index_von_variable(text, variable):
"""
Gibt den Index des ersten Auftretens der
Variable >>variable<< im Programmtext
>>text<< zurueck.
Ist die Variable nicht in >>text<< enthalten,
wird -1 zurueckgegeben.
"""
pass

# Hier fehlt Deine Loesung!

# Ende der Funktion index_von_variable


#######################################
####### AUFGABE b) #######
#######################################


## Beginn der Funktion 'ersetze_variable'


def ersetze_variable(programmtext, alt, neu):
"""
In einem Programmtext wird - wenn moeglich -
die Variable alt durch die Variable neu
ersetzt.
"""
pass

# Hier fehlt Deine Loesung!





# Ende der Funktion 'variablen_ersetzen'




# =======================================================

###### TESTUMGEBUNG (HAUPTPROGRAMM) ######

DATEI = 'programm.py' # Beispiel, kann geaendert werden
VARIABLENNAME_ALT = 'x' # Beispiel, kann geaendert werden
VARIABLENNAME_NEU = 'y' # Beispiel, kann geaendert werden

# -------------------------------------------------------

# Ab hier bitte nichts veraendern!

try:
#Öffnen der Datei 'DATEI'
datei = open(DATEI)

# Anlegen der neuen Datei
DATEI_NEU = name_neu(DATEI)
datei_neu = open(DATEI_NEU,'w')

# Einlesen des Inhalts der Datei
text = datei.read()

# Kontrollausdruck vorher
print(text)

# Aufruf der Funktion 'index_von_variable'
print(index_von_variable(datei, VARIABLE_ALT))

# Aufruf der Funktion 'ersetze_variable'
text_neu = ersetze_variable(text, VARIABLE_ALT, VARIABLE_NEU)

# Kontrollausdruck nachher
print(text_neu)

# Schreiben in neue Datei bei Veraenderungen
if text != text_neu:
datei_neu.write(text)

datei.close()
datei_neu.close()

except:
print('Da hat was nicht geklappt.')

##################### ENDE DER TESTUMGEBUNG ######################



#### START Hilfsfunktion zur Bestimmung des neuen Dateinamens ####
def name_neu(datei):
"""
Erweiterung des Dateinamens um den Suffix '_NEU'
Die Kennung wird beibehalten.
"""
temp = datei.find('.')
punkt = temp
while temp > -1:
temp = datei[punkt+1:].find('.')
if temp > -1:
punkt += temp+1
if punkt > -1:
return datei[:punkt] + '_NEU' + datei[punkt:]
else:
return datei + '_NEU'


#### ENDE Hilfsfunktion zur Bestimmung des neuen Dateinamens ####

Und ich soll zwei Aufgaben dazu erledigen:
a) eine Funktion schreiben die Variablen im Text sucht
Dis soll die Funtkion index von variable(text:str, variable:str) ! int
erledigen, die den Index des ersten Zeichens für das erste Vorkommen der Variablen
im Text zurückgibt. Ist die Variable nicht enthalten, wird -1 zurückgegeben.
Beachte, dass '\n' den Zeilenwechsel darstellt und wie ein einziges Zeichen gezahlt
wird.
Hier einige Beispiele:
>>> text = 'a1 = 2\na = a1 + 3\na2 = a + a1'
>>> index_von_variable(text, 'a1')
0
>>> index_von_variable(text, 'a')
7
>>> index_von_variable(text, 'b')
-1

b) eine zweite Funktion: ersetze variable(text:str, alt:str, neu:str) ! str
Die Funktion ersetzt jedes Vorkommen einer Variablen in
einem Programmtext durch einen neuen Bezeichner. Das geht natürlich nur, wenn
der neue Bezeichner noch nicht im Programm verwendet wurde.
Auch hier zwei Minimalbeispiele:
>>> ersetze_variable('a = 2\n b= 3*a\n c = a * b', 'a', 's')
's = 2\n b= 3*s\n c = s * b'
>>> ersetze_variable('a = 2\n b= 3*a\n c = a * b', 'b', 'c')
'a = 2\n b= 3*a\n c = a * b'


Falls mir jemand helfen könnte wäre ich sehr dankbar. Ich verzweifele schon dabei die Datei in Python zu Öffnen.
Sirius3
User
Beiträge: 14207
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 29. November 2020, 16:32

Bei Deiner Erklärung ist es schwierig zu sagen, woran es liegt. Wie versuchst Du denn "die Datei in Python zu öffnen"?

Die Testumgebung ist Schrott. Das `except´ sollte dringend weg, denn so hast Du keine Chance, Deine Fehler zu beheben, weil Dir gar nicht mitgeteilt wird, was denn falsch ist.

Warum soll denn nur was in eine neue Datei geschrieben werden, wenn sich der Inhalt von der alten Datei unterscheidet? Und was fängt man im anderen Fall mit einer leeren Datei an?

Eine Testumgebung sollte den Code auch testen, also sagen, ob die Funktion das richtige Ergebnis liefert.

Was da in name_neu gemacht wird, macht niemand. Dateinamen sind nicht einfache Strings, sondern eben Dateinamen. Dazu nimmt man also entweder das moderne pathlib oder das etwas angegraute os.path, aber eben keine String-Operationen.

Code: Alles auswählen

from pathlib import Path
def name_neu(datei):
    datei = Path(datei)
    return str(datei.with_stem(datei.stem + '_NEU'))
Wenn man wirklich find benutzen will, dann wäre da rfind das richtige. Wenn man wirklich String-Operationen benutzen will, dann wäre rpartition das richtige.

Code: Alles auswählen

def name_neu(datei):
    """
    Erweiterung des Dateinamens um den Suffix '_NEU'
    Die Kennung wird beibehalten.
    """
    index = datei.rfind('.')
    if index > -1:
        return datei[:index] + '_NEU' + datei[index:]
    else:
        return datei + '_NEU'

def name_neu(datei):
    """
    Erweiterung des Dateinamens um den Suffix '_NEU'
    Die Kennung wird beibehalten.
    """
    name, dot, ext = datei.rpartition('.')
    if dot:
        return name + '_NEU' + dot + ext
    else:
        return datei + '_NEU'
Aber da die Aufgaben auch die Nutzung von find einüben sollen, liebt der Dozent wohl eher BASIC, als Python.
Antworten