Bestimmte Zellen auslesen

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.
Python_starter
User
Beiträge: 8
Registriert: Montag 25. Januar 2010, 14:19

Hallo zusammen.

Ich neu in diesem Forum und habe auch noch nie vorher python programmiert. Nun habe ich meine erste frage :D

Ich will ein script schreiben wo ich ein File öffne und dann nach einem bestimmten wort suche und dann 36 zellen nach diesem wort auslese und ausgebe.. was ich schon habe:


pfad = "C:\\Documents and Settings\\Test\\Desktop\\PythonEinarbeitung\\"
dateiname="testfile.txt"
int_Zellen = 36
datei = pfad+dateiname
in_file = open(datei,'r')
text = in_file.read()
text.find("go")
in_file.close()
print text


Hoffe Ihr könnt mir helfen.

mfg Python_starter :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Erstmal vorweg: es gibt code-Tags zum hervorheben von Python-Code, dass macht deine Beiträge leserlicher.

Zu deinem Problem: Schau mal in der Dokumentation was dir text.find("go") zurückliefert und dann informiere dich über Slicing (ebenfalls in der Dokumentation). Mit den Informationen solltest du es hinbekommen.

Hast du dir das offizielle Python-Tutorial schon durchgelesen? Wenn nicht, dann solltest du es unbedingt nachholen.

Noch zwei drei Anmerkungen:
- Mit dem os.path-Modul kann man Pfade zusammensetzen. Dein Weg ist etwas fehleranfällig und nicht portabel.
- Entscheide dich für englische oder deutsche Namen. Beides gemischt ist recht seltsam.
- Wenn du mit Dateien arbeitest, dann solltest du auch Fehler abfangen. So weit bist du aber wahrscheinlich noch nicht.

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Und Datein mit "with" öffnen bzw. schließen :lol:

Was sind bei dir Zellen?
the more they change the more they stay the same
Python_starter
User
Beiträge: 8
Registriert: Montag 25. Januar 2010, 14:19

hallo sorry mit zellen meinte ich zeilen. :D

Was ich nun gschaft habe bis jetz ist:

Code: Alles auswählen

pfad = "C:\\Documents and Settings\\alijis\\Desktop\\PythonEinarbeitung\\"
dateiname="debug_reset_out_4.txt"
int_Zellen = 36
datei = pfad+dateiname
fobj = open(datei,'r')
foundgo = "false"
howmuch = 0
import re
counter = 32

line = fobj.readline()
while line:
    counter = 32
    result = re.search("go", line)
    if result:
        while counter != 0:
            counter -= 1
            Needed = fobj.readline()
            result2 = re.search("go", Needed)
            if result2:   
                counter = 0
            else:
                print Needed      
line = fobj.readline()
fobj.close()

Dieser Code liesst das File zeile für Zeile durch und sucht nach dem Wort "go" wen es das wort gefunden hat geht es weiter in eine while-schleife und in dieser while schleife werden die nächsten zeilen dann mit print angezeigt. Soweit klappt alles, doch es gibt mehrere "go" in dem file und leider liesst der code jetz nur einmal das go aus und ist dan beendet. Führe ich die while line: nicht bis zum end of file durch ?
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Vielleicht solltest du mal den Aufbau deiner Datei zeigen, dann
ist es auch einfacher eine Lösung zu finden.
Und die Hinweise zum öffnen der Datei beachten :wink:
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Python_starter hat geschrieben:Dieser Code liesst das File zeile für Zeile durch und sucht nach dem Wort "go" wen es das wort gefunden hat geht es weiter in eine while-schleife und in dieser while schleife werden die nächsten zeilen dann mit print angezeigt. Soweit klappt alles, doch es gibt mehrere "go" in dem file und leider liesst der code jetz nur einmal das go aus und ist dan beendet. Führe ich die while line: nicht bis zum end of file durch ?
Ich würde einfach beim Lesen der Datei die Zeilennummer mitzählen, jede Zeilennummer einer Zeile die "go" enthält in eine Liste schreiben und beim Lesen jeder Zeile schauen ob der Wert Zeilennummer - 36 in der Liste steht.
Python_starter
User
Beiträge: 8
Registriert: Montag 25. Januar 2010, 14:19

So sieht etwa die Struktur aus:

Code: Alles auswählen

2010-01-25T11:58:52.029892 I 00020083 isi WDT minute
2010-01-25T11:58:52.344760 I 00020085 inc {"msg":"180000020085000200830C006D0800020085010303004C2D"}
2010-01-25T11:58:52.349858 I 00020083 dal MINILOGGING_MAC_DEBUG_LQM_TX_POWER_DEC
2010-01-25T11:58:52.350604 I 00020083 dal minilog value: 389
2010-01-25T11:58:53.061563 I 00020083 inc {"msg":"1800000200830002008506006D0800020085000502002F7A"}
2010-01-25T11:58:53.066900 I 00020085 dal MINILOGGING_MAC_DEBUG_LQM_TX_POWER_DEC
2010-01-25T11:58:53.067683 I 00020085 dal minilog value: 1155
2010-01-25T11:58:56.273594 I 00020083 ead MINILOGGING_SINGLE_P2_DEVICE_GW_NOT_FOUND_RESET_CONNECTION: No answer from gateway after attach request, delete gateway
2010-01-25T11:59:05.470379 I 00020085 iag P2 tunnel msg to 00020083
2010-01-25T11:59:06.583012 I 00020085 dal MINILOGGING_MAC_DEBUG_LQM_TX_POWER_DEC
2010-01-25T11:59:06.583792 I 00020085 dal minilog value: 899
2010-01-25T11:59:06.586203 I 00020083 inc {"msg":"22100002008300020085070002086408000200850002008301001100000C000099F3"}
2010-01-25T11:59:06.587365 I 00020083 wad MINILOGGING_SINGLE_P2_DEVICE_FOREIGN_MESSAGE: P2 cmd ign
2010-01-25T11:59:18.302326 I 00020085 isi WDT minute
2010-01-25T11:59:22.344158 I 00020085 inc {"msg":"180000020085000200830D006D0800000000010303002482"}
2010-01-25T11:59:22.349232 I 00020083 dal MINILOGGING_MAC_DEBUG_LQM_TX_POWER_DEC
2010-01-25T11:59:22.349970 I 00020083 dal minilog value: 389
2010-01-25T11:59:23.064211 I 00020083 inc {"msg":"1800000200830002008508006D0800020085000502000832"}
2010-01-25T11:59:23.069308 I 00020085 dal MINILOGGING_MAC_DEBUG_LQM_TX_POWER_DEC
2010-01-25T11:59:23.070056 I 00020085 dal minilog value: 643
2010-01-25T11:59:30.675939 I 00020083 isf boot 2.0
2010-01-25T11:59:30.691526 I 00020083 isf msp430-fdrf271_es01
2010-01-25T11:59:30.710582 I 00020085 isf boot 2.0
2010-01-25T11:59:30.711372 I 00020085 isf msp430-fdrf271_es01
2010-01-25T11:59:30.758432 I 00020085 isf go
2010-01-25T11:59:30.759144 I 00020085 esi INFOMEM_VERSION
2010-01-25T11:59:30.759620 I 00020083 isf go
2010-01-25T11:59:30.760301 I 00020083 esi INFOMEM_VERSION
2010-01-25T11:59:30.803118 I 00020085 esi trail: 0xD5DC
2010-01-25T11:59:30.803793 I 00020085 esi trail: 0xC462
2010-01-25T11:59:30.804440 I 00020085 esi trail: 0x119E
2010-01-25T11:59:30.805081 I 00020085 esi trail: 0x11AE
2010-01-25T11:59:30.805725 I 00020085 esi trail: 0xD5DC
2010-01-25T11:59:30.806396 I 00020083 esi trail: 0xBFF4
2010-01-25T11:59:30.807037 I 00020083 esi trail: 0xA28C
2010-01-25T11:59:30.807690 I 00020083 esi trail: 0xA296
2010-01-25T11:59:30.808335 I 00020083 esi trail: 0x9FE0
2010-01-25T11:59:30.865363 I 00020085 esi trail: 0xC508
2010-01-25T11:59:30.866055 I 00020085 esi trail: 0x1DBC
2010-01-25T11:59:30.866702 I 00020085 esi trail: 0xB3D6
2010-01-25T11:59:30.867349 I 00020085 esi trail: 0xB3E0
2010-01-25T11:59:30.868015 I 00020085 esi trail: 0xB0B4
2010-01-25T11:59:30.868666 I 00020085 esi trail: 0x964A
2010-01-25T11:59:30.869311 I 00020085 esi trail: 0xB3E0
2010-01-25T11:59:30.869988 I 00020083 esi trail: 0xBD62
2010-01-25T11:59:30.870633 I 00020083 esi trail: 0x11B6
2010-01-25T11:59:30.871262 I 00020083 esi trail: 0xBFF4
2010-01-25T11:59:30.871893 I 00020083 esi trail: 0xB144
2010-01-25T11:59:30.872522 I 00020083 esi trail: 0x11A6
2010-01-25T11:59:30.873146 I 00020083 esi trail: 0x11B6
2010-01-25T11:59:30.873772 I 00020083 esi trail: 0xBFF4
2010-01-25T11:59:30.874406 I 00020083 esi trail: 0xB1EA
2010-01-25T11:59:30.928293 I 00020085 esi trail: 0xB12A
2010-01-25T11:59:30.928963 I 00020085 esi trail: 0xD282
2010-01-25T11:59:30.929610 I 00020085 esi trail: 0xB3E0
2010-01-25T11:59:30.930249 I 00020085 esi trail: 0xB12A
2010-01-25T11:59:30.930886 I 00020085 esi trail: 0xD34A
2010-01-25T11:59:30.931525 I 00020085 esi trail: 0x11AE
2010-01-25T11:59:30.932166 I 00020085 esi trail: 0xD5DC
2010-01-25T11:59:30.932812 I 00020085 esi trail: 0xC462
2010-01-25T11:59:30.933485 I 00020083 esi trail: 0x1818
2010-01-25T11:59:30.934123 I 00020083 esi trail: 0xA28C
2010-01-25T11:59:30.934751 I 00020083 esi trail: 0xA296
2010-01-25T11:59:30.935376 I 00020083 esi trail: 0x9FE0
2010-01-25T11:59:30.936047 I 00020083 esi trail: 0xBC9A
2010-01-25T11:59:30.936681 I 00020083 esi trail: 0xA296
2010-01-25T11:59:30.937313 I 00020083 esi trail: 0x9FE0
2010-01-25T11:59:30.993772 I 00020085 esi trail: 0x119E
2010-01-25T11:59:30.994447 I 00020085 esi trail: 0x11AE
2010-01-25T11:59:30.995097 I 00020085 esi trail: 0xD5DC
2010-01-25T11:59:30.995745 I 00020085 esi trail: 0xC508
2010-01-25T11:59:30.996391 I 00020085 esi trail: 0x1DBC
2010-01-25T11:59:30.997038 I 00020085 esi trail: 0xB3D6
2010-01-25T11:59:30.997698 I 00020085 esi trail: 0xB3E0
2010-01-25T11:59:30.998350 I 00020085 esi trail: 0xB0B4
2010-01-25T11:59:30.999022 I 00020083 esi trail: 0xBD62
2010-01-25T11:59:30.999661 I 00020083 esi trail: 0x11B6
2010-01-25T11:59:31.000288 I 00020083 esi trail: 0xBFF4
2010-01-25T11:59:31.000913 I 00020083 esi trail: 0xB144
2010-01-25T11:59:31.001537 I 00020083 esi trail: 0x11A6
2010-01-25T11:59:31.002163 I 00020083 esi trail: 0x11B6
2010-01-25T11:59:31.002786 I 00020083 esi trail: 0xBFF4
2010-01-25T11:59:31.003415 I 00020083 esi trail: 0xB1EA
2010-01-25T11:59:31.055465 I 00020085 esi trail: 0x964A
2010-01-25T11:59:31.056140 I 00020085 esi trail: 0x24F8
2010-01-25T11:59:31.056781 I 00020085 esi trail: 0x1DBC
2010-01-25T11:59:31.057438 I 00020085 esi trail: 0x11AE
2010-01-25T11:59:31.058220 I 00020085 imc MAC: own:22, meet:35
2010-01-25T11:59:31.059234 I 00020085 dam MINILOGGING_MESH_DEBUG_MODE_SINK
2010-01-25T11:59:31.060246 I 00020085 dam MINILOGGING_MESH_DEBUG_SENT_HELLO_BROADCAST
2010-01-25T11:59:31.060978 I 00020083 esi trail: 0x1818
2010-01-25T11:59:31.061629 I 00020083 esi trail: 0xA28C
2010-01-25T11:59:31.062257 I 00020083 esi trail: 0x22E8
2010-01-25T11:59:31.062882 I 00020083 esi trail: 0x1818
2010-01-25T11:59:31.063506 I 00020083 esi trail: 0x11B6

@/me deine Antwort habe ich nicht ganz verstanden.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

def get_sample(stream, match, nlines):
    lines = stream.read().splitlines()
    return (lines[i:i+nlines] for i,line in enumerate(lines) if match in line)
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Python_starter hat geschrieben:@/me deine Antwort habe ich nicht ganz verstanden.
In Code gegossen sähe meine Antwort so aus:

Code: Alles auswählen

filename = "plus36.txt"
found = []
with open(filename) as fp:
    for (i, line) in enumerate(fp):
        if "go" in line:
            found.append(i)
            print("Zeile {0}: {1}".format(i, line))
        if (i - 36) in found:
            print("Zeile {0}: {1}".format(i, line))

__________
Edit: Ich habe das "... und dann 36 zellen nach diesem wort auslese und ausgebe ..." so verstanden als solle die 36. Zeile ausgelesen werden und nicht alle Zeilen bis dahin. Wenn du 36 Zeilen willst muss der Code natürlich noch ein wenig angepasst werden. Die Variante von snafu passt da schon gut.
Python_starter
User
Beiträge: 8
Registriert: Montag 25. Januar 2010, 14:19

Hmm, sieht gut aus :D doch wen ich den code ausführen will kommt bei mir ein Fehler bei fp .. wo hast du das definiert oder was ist das genau ? .. das mit filename habe ich einfach meinen genomen also "Datei".
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Python_starter hat geschrieben:Hmm, sieht gut aus :D doch wen ich den code ausführen will kommt bei mir ein Fehler bei fp ..
Bitte gewöhne dir an, Fehler genau zu beschreiben, statt einfach nur "geht nicht" in den Raum zu werfen. Am praktischsten ist es, wenn du die Fehlermeldung per Copy&Paste hier zur Verfügung stellst. Momentan können wir einfach nur raten. Welche Python-Version verwendest du denn eigentlich?

Zur Frage "Was ist fp?" kann ich nur auf die Dokumentation verweisen: http://docs.python.org/reference/compou ... -statement
Python_starter
User
Beiträge: 8
Registriert: Montag 25. Januar 2010, 14:19

achso. Sorry :) .. Ich verwende die Python version 2.5.

Fehler :

Code: Alles auswählen

 line 14
    with open(filename) as fp:
            ^
SyntaxError: invalid syntax
ist das okej so ? :roll:
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich habe das mal etwas anfängerfreundlicher versucht:

Code: Alles auswählen

from __future__ import with_statement

def print_samples(filename, match, nlines):
    with open(filename) as f:
        lines = f.readlines()
    for i, line in enumerate(lines):
        if match in line:
            start = i
            end = start + nlines
            print 'Zeilen %d-%d:' % (start + 1, end)
            print ''.join(lines[start:end])
EDIT: Code nachträglich angepasst.
Zuletzt geändert von snafu am Dienstag 26. Januar 2010, 16:54, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Python_starter hat geschrieben:Ich verwende die Python version 2.5.

Code: Alles auswählen

 line 14
    with open(filename) as fp:
            ^
SyntaxError: invalid syntax
Ah ja. Das with-Statement ist erst ab Version 2.6 vorgesehen. Bei 2.5 müssen wir die Zeitmaschine anwerfen. Setze mal folgendes an den Anfang des Codes

Code: Alles auswählen

from __future__ import with_statement
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

snafu hat geschrieben:

Code: Alles auswählen

from __future__ import with_statement

def print_samples(filename, match, nlines):
    with open(filename) as f:
        lines = f.read().splitlines(True)
    ...
Die letzte zitierte Zeile scheint mir eine eher umwegige Art folgendes auszudrücken:

Code: Alles auswählen

        lines = f.readlines()
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, das hab ich beim Ändern der vorherigen Funktion nicht bedacht.
Python_starter
User
Beiträge: 8
Registriert: Montag 25. Januar 2010, 14:19

Danke viel mals :D Hat geklappt. Ihr seid die besten :D
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Python_starter hat geschrieben:Ihr seid die besten :D
Ich bin Anfänger ...
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... sag sowas nur NIE bei einem Bewerbungsgespräch, hörst Du !!!!
BlackJack

Falls ich das ganze richtig verstanden habe, hier eine Variante, die nicht erst die komplette Datei einliest:

Code: Alles auswählen

from __future__ import with_statement
from itertools import islice


def main():
    with open('test.txt') as lines:
        for line in lines:
            if 'go' in line:
                print line,
                for line in islice(lines, 36):
                    print line,
Antworten