Aufsteigende Zahlenreihe in Textfile

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

Aufsteigende Zahlenreihe in Textfile

Beitragvon Claudia » Sonntag 30. Oktober 2005, 17:01

Hallo,

Ich habe ein Textfile und würde gerne eine aufsteigende Zahlenreihe von 1 bis "id" einfügen. irgendwie funktioniert das aber nicht so, wie ich mir das vorstelle.

Hier mein skript:

#!/usr/bin/python
import sys

# Dateiname ermitteln
dateiname = sys.argv[1]

# Datei lesen
try:
datei = open(dateiname, 'r')
zeilen = datei.readlines()
datei.close()
except IOError:
print dateiname, "ist nicht lesbar"
sys.exit(1)


# Leerzeile und Zahlenreihe einfügen
id = input("Geben Sie die id-Anzahl ein: ")
for i in range(0,id*6,6):
zeilen.insert(i,"\n")
for x in zeilen:
if x < id:
x = 1
x = x + 1
else:
break

# Datei schreiben
try:
datei = open(dateiname, 'w')
datei.writelines(zeilen)
datei.close()
except IOError:
print dateiname, "ist nicht schreibbar"

Eine andere Variante hab ich auch probiert, aber das geht auch nicht:

# Leerzeile und Zahlenreihe einfügen
id = input("Geben Sie die id-Anzahl ein: ")
for i in range(0,id*6,6):
zeilen.insert(i,"\n")
for j in range(id):
print j

das mit dem "print j" ist mir schon klar, daß das nicht funktionieren kann, aber was soll ich sonst hinschreiben... ;-)

hoffe, ihr habt eine Lösung,
lg Claudia
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Sonntag 30. Oktober 2005, 17:22

Du solltest Source-Code immer in [python]-Tags setzten!

Kannst du nicht mal eine Varinate Posten, die ohne eine Datei auskommt, also den Dateiinhalt als String/Liste in's Skript schreiben. Dann kann jeder es auch mal selber Probieren...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Beitragvon Gast » Sonntag 30. Oktober 2005, 17:31

jens hat geschrieben:Du solltest Source-Code immer in [python]-Tags setzten!

Kannst du nicht mal eine Varinate Posten, die ohne eine Datei auskommt, also den Dateiinhalt als String/Liste in's Skript schreiben. Dann kann jeder es auch mal selber Probieren...


Hier die Ausgangsdatei:

-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.873908984382000E+05 0.277388000000750E+06
-0.874167968757000E+05 0.277433000000750E+06
-0.874875000007000E+05 0.277362500000750E+06
-0.874875000007000E+05 0.277362500000750E+06

Bearbeitet sollte sie dann so aussehen:

1
-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
2
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
3
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
4
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.875874999998500E+05 0.277362500000750E+06
5
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.875374999988500E+05 0.277362500000750E+06
6
-0.873908984382000E+05 0.277388000000750E+06
-0.874167968757000E+05 0.277433000000750E+06
-0.874875000007000E+05 0.277362500000750E+06
-0.874875000007000E+05 0.277362500000750E+06
7
.
.
.
.
.
.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Sonntag 30. Oktober 2005, 17:44

Was hälst du hier von:

Code: Alles auswählen

zeilen = """-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.873908984382000E+05 0.277388000000750E+06
-0.874167968757000E+05 0.277433000000750E+06
-0.874875000007000E+05 0.277362500000750E+06
-0.874875000007000E+05 0.277362500000750E+06"""
zeilen = zeilen.split("\n")


# Leerzeile und Zahlenreihe einfügen
id = int(input("Geben Sie die id-Anzahl ein: "))

i = 0
count = 0
for line in zeilen:
    i += 1
    if i == id:
        i = 0
        count += 1
        print count
    print line


Ich würde nur nicht print verwenden, sondern direkt aus der Quellen-Datei lesen, einfügen und direkt in eine neue Datei schreiben...

Ist glaub ich einfacher, als alles in eine Liste zu lesen und mit insert zu bearbeiten.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Beitragvon Buell » Sonntag 30. Oktober 2005, 17:47

ich würds mal mit dem csv Module probieren, ist zwar eigentlich zum schrieben von csv Dateien gedacht aber man kann auch Textfiles damit erstellen.

Beispiel:

Code: Alles auswählen

import csv
    def writeCSV(self):
        temp_content = []
        i=1
        j=6
        x=1
        # Datei auslesen und in jeder 6. Zeile x einfügen
        reader = csv.reader(open("Deine Datei.txt", "rb"))
        for row in reader:
            if i == j:
                temp_row = [ x ]
                temp_content.append(temp_row)
                i = 1
                x += 1
            else:
                temp_content.append(row)
                i += 1
        # Datei schreiben
        writer = csv.writer(open(self.data_path + "Settings.csv", "wb"))
        for row in temp_content:
            writer.writerow(row)
Claudia

Beitragvon Claudia » Sonntag 30. Oktober 2005, 18:32

jens hat geschrieben:Was hälst du hier von:

Code: Alles auswählen

zeilen = """-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.873908984382000E+05 0.277388000000750E+06
-0.874167968757000E+05 0.277433000000750E+06
-0.874875000007000E+05 0.277362500000750E+06
-0.874875000007000E+05 0.277362500000750E+06"""
zeilen = zeilen.split("\n")


# Leerzeile und Zahlenreihe einfügen
id = int(input("Geben Sie die id-Anzahl ein: "))

i = 0
count = 0
for line in zeilen:
    i += 1
    if i == id:
        i = 0
        count += 1
        print count
    print line


Ich würde nur nicht print verwenden, sondern direkt aus der Quellen-Datei lesen, einfügen und direkt in eine neue Datei schreiben...

Ist glaub ich einfacher, als alles in eine Liste zu lesen und mit insert zu bearbeiten.

Code: Alles auswählen



Ich bin Programmier-Anfängerin und daher hab ich soviel wie noch gar keine Ahnung vom Programmieren ;-(

habs jetzt so mal probiert:

zeilen = open("d:/diplomarbeit/dtm/testgebiet/ausgabe4.txt")
aus = open("d:/diplomarbeit/dtm/testgebiet/ausgabe5.txt","w")

zeilen = zeilen.split("\n")

# Leerzeile und Zahlenreihe einfügen
id = int(input("Geben Sie die id-Anzahl ein: "))

i = 0
count = 0
for line in zeilen:
    i += 1
    if i == id:
        i = 0
        count += 1

aus.write()   

Das funktioniert leider nicht... was ist denn da wieder falsch...
Gast

Beitragvon Gast » Sonntag 30. Oktober 2005, 19:14

Hallo,

hier mal eine vollkommen ungetestete Version:

Code: Alles auswählen

inputFile  = file("d:/diplomarbeit/dtm/testgebiet/ausgabe4.txt")
outputFile = file("d:/diplomarbeit/dtm/testgebiet/ausgabe5.txt","w")

counter = 0
id = 0

for line in inputFile:
    counter += 1
    if counter == 4:
        counter = 0
        id += 1
        outputFile.write(str(id))
    outputFile.write(line)

inputFile.close()
outputFile.close()

Probiers einfach mal aus!

MfG,
ein Gast
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Sonntag 30. Oktober 2005, 19:16

Code: Alles auswählen

infile = file("test.txt")
outfile = file("test2.txt","w")

# Leerzeile und Zahlenreihe einfügen
id = int(input("Geben Sie die id-Anzahl ein: "))

i = 0
count = 0
for line in infile:
    i += 1
    if i == id:
        i = 0
        count += 1
        outfile.write("%s\n" % count)
    outfile.write(line)

infile.close()
outfile.close()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Claudia

Beitragvon Claudia » Sonntag 30. Oktober 2005, 20:37

jens hat geschrieben:

Code: Alles auswählen

infile = file("test.txt")
outfile = file("test2.txt","w")

# Leerzeile und Zahlenreihe einfügen
id = int(input("Geben Sie die id-Anzahl ein: "))

i = 0
count = 0
for line in infile:
    i += 1
    if i == id:
        i = 0
        count += 1
        outfile.write("%s\n" % count)
    outfile.write(line)

infile.close()
outfile.close()



Danke Jens, soweit funktioniert es... ein problem gibt es noch: warum fängt python erst in der vierten zeile zum zählen an, und nicht in der ersten??

-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
1
-0.877375000000000E+05 0.277362500000750E+06
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
2
-0.876874999990000E+05 0.277362500000750E+06
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
3
-0.876375000008500E+05 0.277362500000750E+06
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
4
-0.875874999998500E+05 0.277362500000750E+06
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
5
-0.875374999988500E+05 0.277362500000750E+06
-0.873908984382000E+05 0.277388000000750E+06
-0.874167968757000E+05 0.277433000000750E+06
-0.874875000007000E+05 0.277362500000750E+06
6
-0.874875000007000E+05 0.277362500000750E+06
-0.873408984372000E+05 0.277388000000750E+06
-0.873667968747000E+05 0.277433000000750E+06
-0.874374999997000E+05 0.277362500000750E+06
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Sonntag 30. Oktober 2005, 21:14

Code: Alles auswählen

for line in infile:
    if i == id:
        i = 0
        count += 1
        outfile.write("%s\n" % count)
    i += 1   # <-------  !!!
    outfile.write(line)

Jens hat in der if-Schleife i um 1 erhöht bevor er i == id überprüft.

Habe mal i += 1 nach der if-Schleife eingefügt. Das Ergebnis sieht dann so aus:

Code: Alles auswählen

sabba@pc-sarge:~/programmieren/python/Codebeispiele$ ./Zeilen-einfuegen-hochzaehlen.py
Geben Sie die id-Anzahl ein: 4
sabba@pc-sarge:~/programmieren/python/Codebeispiele$ cat ./test2.txt
-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
1
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
2
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
3
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.875874999998500E+05 0.277362500000750E+06
4
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.875374999988500E+05 0.277362500000750E+06


cu Sebastian
Claudia

Beitragvon Claudia » Sonntag 30. Oktober 2005, 21:22

Mr_Snede hat geschrieben:

Code: Alles auswählen

for line in infile:
    if i == id:
        i = 0
        count += 1
        outfile.write("%s\n" % count)
    i += 1   # <-------  !!!
    outfile.write(line)

Jens hat in der if-Schleife i um 1 erhöht bevor er i == id überprüft.

Habe mal i += 1 nach der if-Schleife eingefügt. Das Ergebnis sieht dann so aus:

Code: Alles auswählen

sabba@pc-sarge:~/programmieren/python/Codebeispiele$ ./Zeilen-einfuegen-hochzaehlen.py
Geben Sie die id-Anzahl ein: 4
sabba@pc-sarge:~/programmieren/python/Codebeispiele$ cat ./test2.txt
-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
1
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
2
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
3
-0.874908984373500E+05 0.277388000000750E+06
-0.875167968748500E+05 0.277433000000750E+06
-0.875874999998500E+05 0.277362500000750E+06
-0.875874999998500E+05 0.277362500000750E+06
4
-0.874408984363500E+05 0.277388000000750E+06
-0.874667968738500E+05 0.277433000000750E+06
-0.875374999988500E+05 0.277362500000750E+06
-0.875374999988500E+05 0.277362500000750E+06


cu Sebastian


in der ersten Zeilen muß 1 stehen... das textfile soll dann in einem gis programm polygone erstellen...dh die datei muß unbedingt mit 1 beginnen, damit das programm die koordinaten richtig zuordnen kann
Gast

Beitragvon Gast » Sonntag 30. Oktober 2005, 22:00

Code: Alles auswählen

inputFile  = file("d:/diplomarbeit/dtm/testgebiet/ausgabe4.txt")
outputFile = file("d:/diplomarbeit/dtm/testgebiet/ausgabe5.txt","w")

counter = 0
id = 1

outputFile.write(str(id))

for line in inputFile:
    if counter == 4:
        counter = 0
        id += 1
        outputFile.write(str(id))
    counter += 1
    outputFile.write(line)

inputFile.close()
outputFile.close()
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Sonntag 30. Oktober 2005, 22:20

Oh da habe wohl nicht ganz aufgepasst, so sieht es nun bei mir aus:

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: latin-1 -*-

infile = file("test.txt")
outfile = file("test2.txt","w")
# Leerzeile und Zahlenreihe einfuegen
id = int(input("Geben Sie die id-Anzahl ein: "))

i = 0
count = 1
outfile.write("%s\n" % count)
for line in infile:
    if i == id:
        i = 0
        count += 1
        outfile.write("%s\n" % count)
    i += 1
    outfile.write(line)
infile.close()
outfile.close()


sabba@pc-sarge:~/programmieren/python/Codebeispiele$ ./Zeilen-einfuegen-hochzaehlen.py
Geben Sie die id-Anzahl ein: 4
sabba@pc-sarge:~/programmieren/python/Codebeispiele$ cat ./test2.txt
1
-0.876408984375000E+05 0.277388000000750E+06
-0.876667968750000E+05 0.277433000000750E+06
-0.877375000000000E+05 0.277362500000750E+06
-0.877375000000000E+05 0.277362500000750E+06
2
-0.875908984365000E+05 0.277388000000750E+06
-0.876167968740000E+05 0.277433000000750E+06
-0.876874999990000E+05 0.277362500000750E+06
-0.876874999990000E+05 0.277362500000750E+06
3
-0.875408984383500E+05 0.277388000000750E+06
-0.875667968758500E+05 0.277433000000750E+06
-0.876375000008500E+05 0.277362500000750E+06
-0.876375000008500E+05 0.277362500000750E+06
BlackJack

Beitragvon BlackJack » Sonntag 30. Oktober 2005, 23:51

Eine Variante mit "Zählvariable" weniger:

Code: Alles auswählen

infile = open('test.txt', 'r')
outfile = open('test2.txt', 'w')

lines_per_group = int(raw_input('Anzahl der Zeilen pro Gruppe? '))

group_nr = 1
for line_nr, line in enumerate(infile):
    if (line_nr % lines_per_group) == 0:
        outfile.write('%d\n' % group_nr)
        group_nr += 1
    outfile.write(line)

infile.close()
outfile.close()


Die Zeilennummer kommt jetzt von `enumerate()` und muss nicht mehr "von Hand" hochgezählt werden.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 31. Oktober 2005, 07:59

BlackJack hat geschrieben:Die Zeilennummer kommt jetzt von `enumerate()` und muss nicht mehr "von Hand" hochgezählt werden.

Dazu braucht man also enumerate() ;) Aber bis ich es wieder gebrauchen kann, hab ich es auch schon wieder vergessen und mach es per Hand :roll:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder