text auslesen und zurückschreiben

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.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

text auslesen und zurückschreiben

Beitragvon mzh » Montag 13. April 2009, 20:50

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?
[url=http://www.proandkon.com]proandkon.com[/url]
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Beitragvon mzh » Montag 13. April 2009, 21:00

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')
[url=http://www.proandkon.com]proandkon.com[/url]
lunar

Beitragvon lunar » Montag 13. April 2009, 21:51

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')
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Beitragvon mzh » Montag 13. April 2009, 22:04

@lunar: thanks
Etwa zwanzig neue Ausdrücke, werds versuchen.
[url=http://www.proandkon.com]proandkon.com[/url]

Wer ist online?

Mitglieder in diesem Forum: __deets__, Bing [Bot]