Seite 1 von 1

Datei zeilenweise ändern: Zeile mitloggen

Verfasst: Mittwoch 21. Januar 2009, 12:31
von fredistdurstig
Hallo Leute,

ich parse mit meinem Programm eine Datei durch und nehme in mehreren Zeilen Ersetzungen vor.
Nun möchte ich diese Ersetzungen gerne loggen, und dafür will ich die Zeilennummern der veränderten Zeilen aufzeichnen.
Muss ich dafür eine extra-Zählvariable anlegen oder geht das auch eleganter?

Hier ein beispielhafter Code-Ausschnitt (letzte Zeile ist relevant):

Code: Alles auswählen

for root, folder, files in os.walk(cwd) :
    for file in files:
        if file[-3:] == ".txt":
            filename = str(root) + "\\" + str(file)
            f = open(filename, "r")
            # Zeilenende rausnehmen
            if line[-1] == '\n': line = line[:-1]
            for line in f:
                sub1 = "SuchString";
                if sub1 in line:
                    myLogger.log(filename, #ZEILENNUMMER??)
Dank Euch schonmal!

Verfasst: Mittwoch 21. Januar 2009, 12:35
von Rebecca
Schau dir mal enumerate an.

Verfasst: Mittwoch 21. Januar 2009, 12:52
von fredistdurstig
Herzlichen Dank! Enumerate kannte ich noch nicht. Wusste doch, das Python für das Problem was elegantes hat.
Habe es erfolgreich eingebaut, ungefähr so:

Code: Alles auswählen

for root, folder, files in os.walk(cwd) :
    for file in files:
        if file[-3:] == ".txt":
            filename = str(root) + "\\" + str(file)
            f = open(filename, "r")
            for linenr, line in enumerate(f):
                sub1 = "SuchString";
                if sub1 in line:
                    myLogger.log(filename, linenr)

Verfasst: Mittwoch 21. Januar 2009, 13:21
von snafu
Die Endung würde ich eher mit fnmatch abfragen. Zur Veranschaulichung:

Code: Alles auswählen

from fnmatch import fnmatch
import os

for root, folder, files in os.walk(cwd):
    for filename in files:
        if fnmatch(filename, '*.txt'):
            print filename

Verfasst: Mittwoch 21. Januar 2009, 13:36
von Rebecca
Hey, fnmatch kannte ich noch gar nicht. Das ist ja praktisch, bisher habe ich immer mit endswith oder splitext rumgewurschtelt...