schleife startswith funktioniert nicht

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
_hallo_
User
Beiträge: 4
Registriert: Dienstag 3. November 2009, 15:33

hallo!
ich habe folgendes Problem:
Ich moechte aus einer Datei gewisse Zeilen auslesen, welche mit einem bestimmten Wert beginnen auslesen und in eine neue Datei schreiben, so zeit so gut.
DIes soll jedoch ni einer while schleife passieren.

ich hab das jetzt mal probiert, jedoch gibt er immer nur die erste zeile aus (also den anfangsvariablenwert). kann mir vlt jemand sagen, wo der fehler ist?
herzlichen dank schonmal

EDIT: ok, sorry
also:
1. der code sieht vermutlich deshalb kaputt aus, weil ich gerade erst mit python angefangen habe ;)
2. aehm die zeilen 17-20 stehen so da...
3.start/end sollen variablen sein
4. die werte befinden sich auf jeden fall in der datei
5. was ist try/ except :?
6. die umwandlung int/str muss durchfuehren; da anscheinend der startswith command nur mit str oder int durchfuehrbar ist und jede zeile beginnt mit zwei leerzeichen
die dateien sind ungefaehr so aufgebaut:
40. 45648 4684 46548
41. 45645 456454 4654
42. 465456 45645

etc.

danke nochmals



hier das script:

Code: Alles auswählen

anfangs_datei= file( "datei1", 'r')
txt_file = file( "datei2.txt", 'w')

radius_search = True

start = 75
ende = 80
a = int(start)
b = int(ende)
while radius_search:
    if a == b:
    	a = str(a)
	for line in anfangs_datei:
		if line.startswith("  "+a):
			txt_file.write(line)
	a = int(a)
	anfangs_datei.close()
	txt_file.close()
	radius_search = False
    else:
        a = str(a)
	for line in anfangs_datei:
	    if line.startswith("  "+a):
	         txt_file2.write(line)
	a = int(a)
	a += 1
Zuletzt geändert von _hallo_ am Dienstag 3. November 2009, 16:03, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Der ganze Code sieht kaputt aus!

Der Zeile 17-20 können doch so nicht da stehen!?!

Wir kennen den Inhalt / die Formatierung der Datei nicht - vielleicht steht der Suchbegriff nur einmal da drin?

Das ganze Dateihandling ist ohne with und try / except aufgezogen -> wenig sinnvoll.

Ich kanpiere dieses ganze start / ende und a / b Zeugs nicht. Was ist das? Wozu wird da ständig zwischen int und String hin- und herkonvertiert? Das musst Du mal besser erklären!
_hallo_
User
Beiträge: 4
Registriert: Dienstag 3. November 2009, 15:33

ist geschehen, sry....
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Es ist oftmals besser zu antworten, als nachträglich Dinge in den ersten Post zu scheiben.

Also...

... ich sehe in dem Dateiauszug keine 2 Leerzeichen, gefolgt von 75! Es kann also gar nichts gefunden werden.

Erkläre doch mal en detail, was innerhalb der while-Schleife passieren soll! Dann wirst Du auch merken, wieso dein Code da total sinnlos ist! (Mich wundert es sowieso, dass das keinen Syntax-Fehler gibt!)

Was genau willst Du denn finden? Sind es nur Zahlen? Was genau soll start und ende denn bedeuten? Was verbrigt sich dahinter? Wozu wird dann da etwas mit a und ba gemacht?

try-except benutzt man zum Abfangen von Fehlern. Sollte im Tutorial beschrieben sein :-)

Dateien sollte man ab Python 2.5 (?) mit dem with Statement öffnen. Dazu sollte sich auch etwas im Tutorial finden lassen. (Und natürlich hier im Board bei vielen Threads ;-) )

Aber ganz wichtig: Erkläre mal die Schleife und die Variablen!
_hallo_
User
Beiträge: 4
Registriert: Dienstag 3. November 2009, 15:33

ok,
vielleicht auch wichtig: ich benutze python 2.3.4
hehe,
also in der dateien sind ca. 900 zeilen.
alle sind durchnummeriert und fangen mit zwei leerzeichen und einer ziffer an
ungefaehr so: " 75."
ich moechte nun beispielsweise die 75. bis zur 80. zeile auslesen und in eine datei schreiben
ich hatte gedacht mit einer while schleife und dem aufzaehlen laesst sich das loesen...

mit den variablen anfang/ende will ich vorher festlegen welche zeilen mich interessieren.
die variablen a/b sind einfach die umgewandelten eingegeben anfangswerte.

in der datei sind nur zahlen. :)

danke fuer den hinweise auf die tutorials, allerdings habe ich atm keine zeit mir das durchzulesen, das skript soll bald fertig sein und funktioneren (haha). danach werde ich das sicher tun
im forum, habe ich leider ( auch nach langer suche nichts passendes gefunden)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

ungetestet:

wenn man die Zeilen weiß

Code: Alles auswählen

source = open('datei1.txt', 'r')
ouput = open('datei2.txt', 'w')

lines = source.readlines()
lines_needed = lines[75:80]

for line in lines_needed:
    output.write(line)

source.close()
output.close()
wenn man sie nicht weiß:

Code: Alles auswählen

source = open('datei1.txt', 'r')
output = open('datei2.txt', 'w')

lines = source.readlines()

start = '   75'
found = False

for i, line in enumerate(lines):
     if line.startswith(start):
         found = i
         break

if found:
    lines_needed = lines[found:found+5]

    for line in lines_needed:
        output.write(line)

source.close()
output.close()

//Edit: Beides ungetestet!!

//Edit²: Fehler im Code behoben
Zuletzt geändert von Dav1d am Mittwoch 4. November 2009, 11:50, insgesamt 1-mal geändert.
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, bei einer so alten Python-Version gibt es with noch nicht. Wohl aber try / except...

Man kann direkt über die Zeilen einer Datei iterieren.
Hier mal mein Versuch, der vermutlich mit Python < 2.5 kompatibel sein sollte:

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys

# untere, obere scharnken der zeilen, die kopiert werden sollen
LIMIT = (1, 1)

def main():
	try:
		in_file = open(sys.argv[1], "r")
		out_file = open(sys.argv[2], "w")
	except IOError, e:
		print e
	else:
		for index, line in enumerate(in_file):
			if index >= LIMIT[0] and index <= LIMIT[1]:
				out_file.write(line)
	finally:
		in_file.close()
		out_file.close()


if __name__ == "__main__":
	main()
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Nimm das von Hyperion (is schöner und auch besser)

das Skript von Hyperion musst du mit Parametern starten, sonst kommts zu Fehlern
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dav1d hat geschrieben: das Skript von Hyperion musst du mit Parametern starten, sonst kommts zu Fehlern
Ja, stimmt, das hätte ich mal dokumentieren sollen ;-)

Also...

Parameter 1: Dateiname der Datei mit den Eingangsdaten
Parameter 2: Dateiname unter dem die Resultate abgelegt werden sollen
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich würde main so schreiben, dass es zwei Parameter entgegennimmt (file_in und file_out, ggf. bessere Namen). Dann die letzten Zeilen so

Code: Alles auswählen

if __name__ == "__main__":
    try:
        file_in, file_out = sys.argv[1:3]
    except (IndexError, ValueError):
        sys.stderr.write(
            'Error: no file names given\n'
            'usage: %s file_in file_out' % __file__
        )
    else:
        main(file_in, file_out)
(code ungetestet)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

derdon hat geschrieben:Ich würde main so schreiben, dass es zwei Parameter entgegennimmt (file_in und file_out, ggf. bessere Namen). Dann die letzten Zeilen so

Code: Alles auswählen

if __name__ == "__main__":
    try:
        file_in, file_out = sys.argv[1:3]
    except (IndexError, ValueError):
        sys.stderr.write(
            'Error: no file names given\n'
            'usage: %s file_in file_out' % __file__
        )
    else:
        main(file_in, file_out)
(code ungetestet)
Hm...ok, kann man so machen. Wobei ich dann irgend wann doch zu optparse greifen würde ;-)

Außerdem würde ich in_file mit "name" ergänzen o.ä., damit deutlich wird, dass es sich nur um den Namen handelt.
_hallo_
User
Beiträge: 4
Registriert: Dienstag 3. November 2009, 15:33

Vielen Dank schonmal!!
Leider bekomme ich bei Hyberions Skript einen syntax fehler :(

Code: Alles auswählen

  File "skript.py", line 20
    finally:
          ^
SyntaxError: invalid syntax
Ich habe auch etwas an meiner while schleife gefeilt, sie ist jetzt zwar noch unuebersichtlicher und es sicher leute die zuerden mich dafuer toeten, aber sie funktioniert (erstaunlicherweise).
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

@Dav1d: in deinem code taucht ein a auf: if line.startswith(a): obwohl du vorher nie eins benutzt hast!
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

_hallo_ hat geschrieben:Vielen Dank schonmal!!
Leider bekomme ich bei Hyberions Skript einen syntax fehler :(

Code: Alles auswählen

  File "skript.py", line 20
    finally:
          ^
SyntaxError: invalid syntax
Vermutlich kann Python 2.4 noch kein try..except..finally, d.h. du musst zwei Blöcke machen try( try .. except) finally.
_hallo_ hat geschrieben: Ich habe auch etwas an meiner while schleife gefeilt, sie ist jetzt zwar noch unuebersichtlicher und es sicher leute die zuerden mich dafuer toeten, aber sie funktioniert (erstaunlicherweise).
Wenn DU dich schon wunderst, dass deine Implementierung überhaupt funktioniert, solltest du dir auf jeden Fall mal Gedanken machen, ob du wirklich den richtigen Weg gegangen ist. Die Einstellung "Hauptsache es funktioniert" ist nicht wirklich geeignet um funktionierenden Code zu schreiben, der auch in wirklich allen Grenzfällen das gewünschte Verhalten zeigt. Du solltest auf jeden Fall deinen Code noch einmal redesignen, wenn du ihn schon kryptisch findest.
Bitte poste deinen Code erst, wenn er überarbeitet ist, ich hab ein komisches Gefühl bei deiner Formulierung ;)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

INFACT hat geschrieben:@Dav1d: in deinem code taucht ein a auf: if line.startswith(a): obwohl du vorher nie eins benutzt hast!
Ach mist, das a soll start sein!

ich edite es
the more they change the more they stay the same
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich habe mir den thread nicht ganz durchgelesen aber dein code hat schon einen einrückungs fehler, ohne auf andere sachen zu achten:

Code: Alles auswählen

anfangs_datei= file( "datei1", 'r')
txt_file = file( "datei2.txt", 'w')

radius_search = True

start = 75
ende = 80
a = int(start)
b = int(ende)
while radius_search:
    if a == b:
        a = str(a)
        for line in anfangs_datei:
            if line.startswith("  "+a):
                txt_file.write(line)
        a = int(a)
        anfangs_datei.close()
        txt_file.close()
        radius_search = False
    else:
        a = str(a)
    for line in anfangs_datei:
        if line.startswith("  "+a):
             txt_file2.write(line)
    a = int(a)
    a += 1
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Antworten