Seite 1 von 1

text auslesen und zurückschreiben

Verfasst: Montag 13. April 2009, 20:50
von mzh
Hallo zusammen
In meinem .dat file sind ein paar Daten in Kolonen gespeichert.
Sieht etwa so aus:
  • #1gym 0 0
    HIS 32 A 8.11 1.61 7.6 1.1 6.5
    HIS 61 A 4.99 -1.51 3 -3.5 6.5
    HIS 81 A 4 -2.5 3 -3.5 6.5
    HIS 82 A 6.55 0.05 6.9 0.4 6.5
    HIS 92 A 6.43 -0.07 5.4 -1.1 6.5
    HIS 227 A 4.05 -2.45 6.9 0.4 6.5
.

Ich brauch aber die 4. und 5. Kolonne nicht, die Nullen in der ersten Zeile spielen keine Rolle, das ganze wird mit GNUPlot geplottet und dort ist hinter '#' ein Kommentar.

Ich möchte nun das ganze .dat-File (bzw. alle im Verzeichnis) einlesen und alles ausser den beiden genannten Kolonnen wieder zurückschreiben.
Hier mein Ansatz:

Code: Alles auswählen

class rewriter():
    def __init__(self):
        self.pattern = r'^\d\w{3}$'
        self.dir = sys.argv[1]
        self.filelist = []
        self.filevalue = ''
    
    
    def rewriteDats(self):
        #List all elements in the directory.
        for dat in listdir(self.dir):
            #The-name-of-the-files-collecto.
            #Make sure only the protein files are being provided.
            name = dat
            if re.search(self.pattern, splitext(name)[0]) and splitext(name)[1][1:] == 'dat':
                self.filelist.append(name)
                print(name)
                datfile = open(join(self.dir, name), 'w')
                datvalue = datfile.readlines()
                for line in datvalue:
                    if line[0]!= '#':
                        linelist = line.split()
                        lineString = " ".join([linelist[0], linelist[1], linelist[2], linelist[5], linelist[6]]) + "\n"
                        datfile.write(lineString)
                datfile.close()
Wenn ich den lineString am Ende einfach printe(), dann kommt genau das raus, was ich will. Nur das Schreiben ins File klappt nicht. Ich bekomme einen
  • AttributeError: 'BufferedWriter' object has no attribute 'read1'
Wie kann ich das korrigieren?

Verfasst: Montag 13. April 2009, 21:00
von mzh
Ok, ich habe gerade festgestellt, dass das Problem offenbar darin besteht, dass ich nicht gleichzeitig ein File offen haben kann, rauslesen und dann gleich noch wieder reinschreiben.
Ich mache jetzt jedesmal ein separates, zweites File auf und schreibe dort rein. Es klappt, habe jetzt aber zu jedem file.dat ein file2.dat.

Code: Alles auswählen

datfile = open(join(self.dir, name), 'r')
writefile = open(join(self.dir, splitext(name)[0]+'2' + splitext(name)[1]), 'w')

Verfasst: Montag 13. April 2009, 21:51
von lunar
Am besten tust du folgendes:

Code: Alles auswählen

import os
from contextlib import nested

with nested(open('file.dat', 'r'), open('file.dat.new', 'w')) as source, sink:
    data = source.read()
    # daten manipulieren
    sink.write(data)
    os.fsync(sink.fileno)
os.rename('file.dat', 'file.dat.old') # optional
os.rename('file.dat.new', 'file.dat')

Verfasst: Montag 13. April 2009, 22:04
von mzh
@lunar: thanks
Etwa zwanzig neue Ausdrücke, werds versuchen.