Ich versuche, ein Skript in Python zu schreiben, das einen Datensatz normalisiert, indem alle Wertelemente durch das Maximalwertelement geteilt werden.

Dies ist das Skript, das ich mir bisher ausgedacht habe:

#!/usr/bin/python

with open("infile") as f:
    cols = [float(row.split("\t")[2]) for row in f.readlines()]
    maxVal = max(cols)
    #print maxVal

    data = []
    with open('infile') as f2:
        for line in f2:                  
            items = line.split() # parse the columns
            tClass, feats, values = items[:3] # parse the columns
            #print items      
            normalizedData = float(values)/float(maxVal)
            #print normalizedData

            with open('outfile', 'wb') as f3:
            output = "\t".join([tClass +"\t"+ feats, str(normalizedData)])
            f3.write(output + "\n")

In dem das Ziel darin besteht, eine Eingabedatei (3 Spalten durch Tabulatoren getrennt) zu erstellen, wie z.

lfr about-kind-of+n+n-the-info-n    3.743562
lfr about+n-a-j+n-a-dream-n 2.544614
lfr about+n-a-j+n-a-film-n  1.290925
lfr about+n-a-j+n-a-j-series-n  2.134124
  1. Suchen Sie nach dem maxVal in der dritten Spalte: In diesem Fall wäre es 3.743562
  2. Teilen Sie alle Werte in der 3. Spalte durch maxVal
  3. Ausgabe nach gewünschten Ergebnissen:
lfr   about-kind-of+n+n-the-info-n    1
lfr   about+n-a-j+n-a-dream-n 0.67973
lfr   about+n-a-j+n-a-film-n  0.34483
lfr   about+n-a-j+n-a-j-series-n  0.57007

Was derzeit "ausgegeben" wird, ist jedoch nur ein einziger Wert, von dem ich annehme, dass er der erste Wert in den Eingabedaten geteilt durch die max. Irgendwelche Erkenntnisse darüber, was in meinem Code falsch läuft: Warum druckt die Ausgabe nur eine Zeile? Irgendwelche möglichen Einblicke in Lösungen? Vielen Dank im Voraus.

1
owwoow14 1 Dez. 2013 im 13:52

3 Antworten

Beste Antwort

Soweit ich Ihre Absichten verstanden habe, erledigt das Befolgen den Job. (Kleinere Programmflusskorrekturen)

Anstatt kontinuierlich in die Datei zu schreiben, habe ich mich stattdessen dafür entschieden, zu speichern, was geschrieben werden soll, und dann alles in die Ausgabedatei zu kopieren.

Update - Es stellt sich heraus, dass die Erstellung von list genauso lange dauert wie die Verwendung der überschüssigen with -Anweisung. Daher wurde sie vollständig entfernt. Schreiben Sie nun kontinuierlich in die Datei, ohne sie jedes Mal zu schließen.

with open("in.txt") as f:
    cols = [float(row.split()[2]) for row in f.readlines()]
    maxVal = max(cols)
    #print maxVal

data = list()
f3 = open('out.txt', 'w')
with open('in.txt') as f2:
    for line in f2:
        items = line.split() # parse the columns
        tClass, feats, values = items[:3] # parse the columns
        #print items
        normalizedData = float(values)/float(maxVal)
        #print normalizedData

        f3.write("\t".join([tClass +"\t"+ feats, str(normalizedData), "\n"]))
f3.close()
1
shad0w_wa1k3r 1 Dez. 2013 im 11:15

Sie müssen die Ausgabedatei einmal öffnen und während der Verarbeitung der Eingabezeilen weiter darauf schreiben. Es wäre auch viel einfacher, wenn Sie das Modul csv für die Eingabe und Ausgabe verwenden würden:

import csv

with open("infile", 'rb') as inf:
    reader = csv.reader(inf, delimiter='\t')
    maxVal = max(float(row[2]) for row in reader)

with open('infile') as inf, open('outfile') as outf:
    reader = csv.reader(inf, delimiter='\t')
    writer = csv.writer(outf, delimiter='\t')
    for row in reader:
        tClass, feats, values = row[:3]

        normalizedData = float(values) / maxVal

        writer.writerow([tClass, feats, values])
1
Martijn Pieters 1 Dez. 2013 im 10:40
#!/usr/bin/python

with open("lfr") as f:
    cols = [float(row.split("\t")[2]) for row in f.readlines()]
    maxVal = max(cols)
    #print maxVal

    data = []
    output1 = ''
    with open('lfr') as f2:
        for line in f2:                  
            items = line.split() # parse the columns
            tClass, feats, values = items[:3] # parse the columns
            #print items      
            normalizedData = float(values)/float(maxVal)
            output1 += tClass + "\t" + feats + "\t" + str(normalizedData) + "\n"

            with open('outfile', 'wb') as f3:
                output = output1
                f3.write(output + "\n")

Ich habe auch daran gearbeitet, anscheinend habe ich keine Ausgabevariable erstellt, indem ich die Ergebnisse jedes Zyklus angehängt habe. Es scheint jedoch etwas langsam zu sein (2 Sekunden, um 4 MB-Dateien zu verarbeiten). Kann dies möglicherweise optimiert werden?

0
owwoow14 1 Dez. 2013 im 10:57