@JanInfoHD: Wenn Du oben beim Import `x` definierst dann ist das ein `x` das auf Modulebene existiert aber nicht das selbe ist wie der lokale Name `x` innerhalb der Funktion.
Teil das Problem doch mal in kleinere Teilschritte auf die Du jeweils durch eine eigene Funktion löst. Die dann testen ob sie tatsächlich funktioniert. Und am besten erst mit der nächsten Funktion weitermachen wenn man eine fertig hat und weiss das die funktioniert, eben weil man sie mit verschiedenen Werten/Szenarien getestet hat.
Eine mögliche Aufteilung wäre beispielsweise eine Funktion welche die Datei liest und deren Inhalt als Zahl liefert oder 0 falls die Datei nicht existiert. (Und in der Funktion die Datei dann *nicht* anlegen!)
Und dann eine Funktion die eine Zahl in eine Datei schreibt.
Die beiden Funktionen kann man dann in einer Funktion verwenden die lesen, erhöhen, und schreiben verbindet.
Programmieren bedeutet oft Probleme in kleinere Teilprobleme zu zerlegen. Und diese Teilprobleme dann auch wieder zerlegen, solange bis man Teilprobleme hat, die sich leicht in wenigen Zeilen Code in einer Funktion lösen lassen. Die dadurch gewonnen Teillösungen testet man dann und wenn sie funktionieren, setzt man sie zu grösseren Teillösungen zusammen, bis man das Gesamtproblem erschlagen hat.
Weitere Anmerkungen: Zur Namenschreibweise und Quelltextformatierung lohnt sich ein Blick in den
Style Guide for Python Code. Die Funktion sollte beispielweise klein geschrieben werden, denn so sieht der Name nach einer Klasse aus.
Vergleiche mit literalen Wahrheitswerten macht man nicht, denn da kommt ja sowieso nur wieder ein Wahrheitswert heraus. Wenn man den Test negieren möchte, dann geht das mit ``not``, also ``if not os.path.exist('lastID.txt'):``.
Dateien die man öffnet sollte man auch wieder schliessen. Genau daher kommt nämlich Dein Problem: die '0' wird nicht in die Datei geschrieben weil die meisten Laufzeitbibliotheken die Dateioperationen anbieten Daten erst im RAM puffern bis genug für einen sinnvollen Schreibvorgang zusammengekommen ist, oder der Programmierer explizit sagt das der Puffer rausgeschrieben werden soll. Dies passiert auch implizit bei einem `close()`-Aufruf. Noch besser aber ist es wenn man Dateien wo das möglich ist zusammen mit der ``with``-Anweisung öffnet. Dann wird die Datei in jedem Fall geschlossen wenn der ``with``-Block verlassen wird, also auch wenn da mittendrin ein ``return`` steht, oder der Block durch eine Ausnahme verlassen wird.
Das „Don't Repeat Yourself“-Prinzip (DRY) sagt das sich Code und Daten nicht wiederholen sollten. Der Dateiname sollte da nur *einmal* im Quelltext stehen. Zum Beispiel als Konstante definiert oder der Funktion als Argument übergeben. Sonst muss man den Quelltext an vielen Stellen ändern wenn man den Namen mal anpassen möchte und dabei besteht dann die Gefahr das man eine Stelle vergisst, oder nicht an allen Stellen exakt die gleiche Änderung macht.
Auf die Existenz der Datei zu testen ist in Python unüblich. Man würde hier einfach davon ausgehen das sie existiert und dann den Fall das sie nicht existiert über die Ausnahmebehandlung bearbeiten.
Ich persönlich würde Textdateien immer mit einem Zeilenendezeichen beenden. Zumindest unter Linux/Unix ist das so üblich weil viele Programme das erwarten. Also dass man beispielsweise einfach zwei Textdateien hintereinander kopieren kann ohne das an der ”Nahtstelle” dann eine Zeile existiert, die aus dem Inhalt der letzten Zeile aus der ersten Datei und dem Inhalt der ersten Zeile aus der zweiten Datei besteht.
Man muss die Datei eigentlich auch gar nicht mit einer 0 erstellen. Man kann im Falle das es die Datei nicht gibt auch `x` einfach als 0 annehmen und dann gleich mit dem erhöhen und schreiben weitermachen.
`Counter()` sollte sich nicht selbst aufrufen. Die Funktion löst kein rekursives Problem, sondern der Aufruf wird einfach nur als ”Wiederholung” missbraucht. Dabei ist das überhaupt gar nicht nötig wenn man den ``else``-Zweig weglässt und dessen Inhalt einfach nach dem ``if``-Zweig ausführen lässt!
Das ``datei.close()`` innerhalb der ``for``-Schleife ist unsinnig. `readlines()` verwendet man eigentlich auch nicht mehr, denn Dateiobjekte sind iterierbar, das heisst wenn man direkt über die Datei iteriert bekommt man die Zeilen. Falls die komplette Datei nur aus dem Zähler besteht, würde ich sie komplett einlesen, dann erkennt man auch beim Umwandeln des Inhalts in eine Zahl ob da neben dem Zähler noch irgend welche anderen Daten stehen die dort nicht hingehören.
Das Umwandeln in eine Zahl fehlt in Deinem Programm. Auf Zeichenketten kann man nicht eine 1 addieren.
Zeile 14 sieht irgendwie geraten aus. Die `write()`-Methode erwartet/kennt kein Argument mit dem Namen `x`. Das wäre dann der nächste Fehler der in der Zeile dann zur Ausnahme führt wenn ein lokales `x` definiert ist. Und man muss die um eins erhöhte Zahl dann zum schreiben in eine Datei natürlich auch wieder in eine Zeichenkette umwandeln, denn Zahlen kann man nicht in eine Datei schreiben.