Ziffern in Zeile hinzufü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.
Antworten
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Hallo,
ich bräuchte mal die Hilfe des Forums. Ich habe leider gar keine Ahnung mehr von Phyton, vor 5 Jahren habe ich mich mit Phyton im Rahmen einer Informatikgrundvorlesung beschäftigt.

Zum Problem, ich habe eine Datei mit über 7 Millionen Zeilen, Hochwert,Rechtswert,Höhe alles im UTM Format. Beim Hochwert wurden die ersten beiden Ziffern die 3 und die 2 Weggeschnitten.
Ich kann die Datei nicht mit Excel bearbeiten. Als Beispiel:
375000.00,5709027.56,59.98
und so sollte es aussehen,
32375000.00,5709027.56,59.98


Gruß Kai
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Wie lautet denn deine konkrete Frage? Wie man eine Zeile so neu erstellt, dass da ein 32 vor steht?

Code: Alles auswählen

>>> zeile = "375000.00,5709027.56,59.98"
>>> neue_zeile = "32"+zeile
>>> print neue_zeile
32375000.00,5709027.56,59.98
BlackJack

@Kanhbein.Kai: Wenn Du es schon einmal konntest, dann solltest Du Dich doch eigentlich mit einem Tutorial wieder recht flott in Python einarbeiten können. In der Python-Dokumentation gibt es ein Tutorial.

Du kannst das rein mit Zeichenkettenoperationen lösen, oder das `csv`-Modul zu Hilfe nehmen. Wobei ich nicht so ganz verstehe wo die fehlenden Daten herkommen‽
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@sparrow,
Wie man das Programmieren würde. Ich habe keine Ahnung mehr.
Der Ablauf wäre wie folgt.
Datei auswählen; 1 Zeile auslesen; 32 hinzufügen; 1 Zeile speichern; 2 Zeile auslesen; 32 hinzufügen; 2 Zeile speichern; ... ; das über 7 Millionen mal.

@BlackJack
Das sind Hochwert, Rechtswert und Höhenangaben, ich würde damit ein Höhenmodell erstellen. Das Programm mit dem ich das Modell erstelle arbeitet mit den "vollen" Koordinaten z.B. 32375997.589, in der Datei sind die ersten beiden Ziffern weggelassen worden.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kahnbein.Kai: Dir sagt hoffentlich "for-Schleife" noch etwas, dann braucht man nicht 7 Millionen mal das selbe zu schreiben.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Ja weiss ich noch.

Ich habe jetzt mal eine TEST.txt erstellt.

Das habe ich bis jetzt

datei=open("TEST.txt,"r")
for zeile in datei:
print(32+zeile)
datei.close()

Aber es geht nicht.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kahnbein.Kai: und was geht nicht? Gibt es eine Fehlermeldung? Wenn ja, welche?
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@Sirius3

Tut mir leid, ich bin gerade auf 180, da es einfach nicht klappt.
Ich habe die *.py Datei in dem Ordner mit der Test.txt gespeichert. Leider geht das Dos-Fenster direkt wieder zu.
In der Vorlesung meine ich haben wir gelernt das eine Input() am Ende, das automatische Schließen verhindert.
Angehängt ist ein Screenshot des Fensters.Bild

Der Quellcode natürlich noch,

Code: Alles auswählen

datei=open("test.txt","r")
for zeile in datei:
	print(32+zeile)
datei.close()
input()
Zuletzt geändert von Kahnbein.Kai am Mittwoch 24. Juni 2015, 19:30, insgesamt 2-mal geändert.
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Erstens fehlt ein doppeltes Hochkomma und zweitens benutze entweder eine IDE deren Ausgaben in einem Fenster landen oder ruf gleich die Programme von der Kommandozeile auf.

PS: Wir haben auch ein Python Tag, der dient nicht nur zur Deko.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Danke, ist geändert.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Es klappt !

Code: Alles auswählen

datei=open("test.txt","r")
for zeile in datei:
        print("32"+zeile)
datei.close()
input()
Tut mir leid, ich bin echt eingerostet ! Ich habe die " vergessen bei 32.
Jetzt ist das Problem, das das Dos-Fenster offen bleibt aber in der test.txt werden die Zeilen nicht geändert :(
Das hängt wohl mit dem "r" zusammen oder? Aber erst muss Phyton die Datei lesen, oder ist beiden möglich, z.B. "rw".

Gruß Kai
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kahnbein.Kai: Du brauchst zwei verschiedene Dateien, eine zum Lesen und eine zum Schreiben.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

import os
with open("test.txt", "r") as in_, open("test.new", "w") as out:
    for line in in_:
        out.write("32" + line)

os.rename("test.new", "test.txt")
Fehlt natuerlich noch eine Fehlerbehandlung.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@sirius3
Danke für deine Geduld.

Code: Alles auswählen

datei=open("test.txt","r")
for zeile in datei:
        print("32"+zeile)
dateia=open("test-bearbeitet.txt","w")
        print(zeile)
datei.close()
input()
Es wir eine Datei test-bearbeitet.txt erstellt, die aber leer ist. Folgende Fehlermeldung wird ausgegeben "unexpected ident"
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kahnbein.Kai: Zeile 4 beendet den for-Schleifen-Block, weil sie auf der gleichen Ebene wie das for eingerückt ist. Die Zeile danach ist eingerückt, obwohl kein neuer Block anfängt. Daher der Fehler.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@ cofi,
ja es klappt.
Ich habe ein paar Fragen dazu

Code: Alles auswählen

    import os # was ist import os ? 
    with open("test.txt", "r") as in_, open("test.new", "w") as out:
        for line in in_:
            out.write("32" + line)
     
    os.rename("test.new", "test.txt")
Ist meins komplett falsch, oder geht es so auch ?

Gruß Kai
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Ich bekomme es selber einfach nicht hin.

Code: Alles auswählen

datei=open("test.txt","r")
for zeile in datei:
        print("32"+zeile)
        dateia=open("test-bearbeitet.txt","w")
        dateia.write(zeile)
datei.close()
dateia.close()
input()
test.txt beinhaltet zum Testen folgende Werte

30000
30003
30000
00000
03000
03003

diese werden im DOS Fenster auch in

3230000
3230003
3230000
3200000
3203000
3203003

umgewandelt. In die Datei test-bearbeitet.ext schreibt Python aber nur

03003
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Schau mal wie oft "test-bearbeitet.txt" geoeffnet wird.

`os` ist ein Modul der Standardbibliothek; Python hat eine Dokumentation: https://docs.python.org/2/library/os.html
Du kannst es natuerlich auch ohne `with` machen, aber so wird garantiert, dass die Dateien auch wieder geschlossen werden.

Und: Lass das `input()` am Ende weg und starte es aus der Konsole. Sonst wirst du im Fehlerfall keine Meldung sehen.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

ah ok,
Ich glaube ich habe es auch nach vielem rumprobieren.

Code: Alles auswählen

datei=open("test.txt","r")
dateia=open("test-bearbeitet.txt","w")
for zeile in datei:
       print("32"+zeile)
       dateia.write("32"+zeile)
datei.close()
dateia.close()
Jetzt werden beide Dateien richtig ausgegeben.
Ist das von Ihnen "besser" Programmiert, muss bei meiner Lösung zwei mal die 32 hinzugefügt werden ?
In der Vorlesung ist hinter beim

Code: Alles auswählen

dateia.write("32"+zeile,file=datei)
angehängt, leider ist keine Erklärung dabei was das file= bringt.

Danke für eure Hilfe ! Ich werde mich bestimmt nochmal melden :)

Schönen Abend noch !
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

In der Vorlesung steht bestimmt nicht `dateia.write(..., file=datei)`, sondern viel eher `print(..., file=datei)` und macht damit (fast) das gleiche wie dein `file.write` Aufruf. Dokumentation dazu: https://docs.python.org/3/library/functions.html#print
Antworten