Seite 1 von 1
schleife startswith funktioniert nicht
Verfasst: Dienstag 3. November 2009, 15:43
von _hallo_
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
Verfasst: Dienstag 3. November 2009, 15:52
von Hyperion
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!
Verfasst: Dienstag 3. November 2009, 16:01
von _hallo_
ist geschehen, sry....
Verfasst: Dienstag 3. November 2009, 16:10
von Hyperion
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!
Verfasst: Dienstag 3. November 2009, 16:23
von _hallo_
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)
Verfasst: Dienstag 3. November 2009, 16:56
von Dav1d
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
Verfasst: Dienstag 3. November 2009, 17:00
von Hyperion
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()
Verfasst: Dienstag 3. November 2009, 17:04
von Dav1d
Nimm das von Hyperion (is schöner und auch besser)
das Skript von Hyperion musst du mit Parametern starten, sonst kommts zu Fehlern
Verfasst: Dienstag 3. November 2009, 17:06
von Hyperion
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
Verfasst: Dienstag 3. November 2009, 20:11
von derdon
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)
Verfasst: Dienstag 3. November 2009, 21:12
von Hyperion
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.
Verfasst: Mittwoch 4. November 2009, 09:18
von _hallo_
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).
Verfasst: Mittwoch 4. November 2009, 10:06
von INFACT
@Dav1d: in deinem code taucht ein a auf: if line.startswith(a): obwohl du vorher nie eins benutzt hast!
Verfasst: Mittwoch 4. November 2009, 11:30
von ms4py
_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

Verfasst: Mittwoch 4. November 2009, 11:49
von Dav1d
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
Verfasst: Mittwoch 4. November 2009, 14:24
von INFACT
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