2016-07-25 31 views
-1

Ich habe eine Datei, die im Grunde wie folgt aussieht:Verketten am Ende eines Strings - Python

atom 
coordinateX coordinateY coordinateZ 
atom 
coordinateX coordinateY coordinateZ 
... 

Ich versuche, die Atomzahl (ab 0), so dass meine Datei aussehen würde hinzufügen dies:

atom0 
coordinateX coordinateY coordinateZ 
atom1 
coordinateX coordinateY coordinateZ 
... 

Hier ist mein Code und mein Problem:

readFile = open("coordinates.txt", 'r') 
writeFile = open("coordinatesFormatted.txt", 'w') 
index = 1 
counter = 0 

for lineToRead in readFile: 
    lineToRead = lineToRead.lstrip() 
    if index % 2 == 0: 
     counter = counter + 1 
     lineToRead+=str(counter) 
    writeFile.write(lineToRead) 
    index = index+1 

readFile.close() 
writeFile.close() 

f = open('coordinatesFormatted.txt','r') 
temp = f.read() 
f.close() 

f = open('coordinatesFormatted.txt', 'w') 
f.write("0") 
f.write(temp) 
f.close() 

Statt meine gewünschte Ausgabe zu haben, nachdem ich meinen Code ich betreibe get this:

0atom 
coordinateX coordinateY coordinateZ 
1atom 
coordinateX coordinateY coordinateZ 
... 

Jede Hilfe wäre willkommen!

Antwort

2

Sie 2 kombiniert Probleme haben, die eine lustige Kombination macht: eine gerade/ungerade Problem auf Ihrem Zähler und die Verwendung von lstrip statt strip: strip entfernt den Zeilenvorschub, die Ihre Linien verschieben.

Ich habe Ihren Code neu geschrieben, den letzten Teil entfernt, der jetzt nutzlos ist und jetzt funktioniert es wie erwartet.

readFile = open("coordinates.txt", 'r') 
writeFile = open("coordinatesFormatted.txt", 'w') 
index = 1 
counter = -1 

for lineToRead in readFile: 
    lineToRead = lineToRead.strip() 
    if index % 2: 
     counter += 1 
     lineToRead+=str(counter) # append counter to atom without linefeed 
    writeFile.write(lineToRead+"\n") # write line, adding the linefeed again 
    index += 1 

readFile.close() 
writeFile.close() 
1

Das Ausführen von zwei Zählern in Ihrer Schleife kann ziemlich unordentlich werden. Und du bist nicht richtig Strippen diese Zeilen.

Folgendes funktioniert was Sie ersetzen möchten index und count mit einem itertools.count Objekt. Das neue Zeilenzeichen wird der Zeile mit der write-Methode hinzugefügt:

from itertools import count 

c = count() # set up a counter that starts from zero 
with open('coordinates.txt') as f, open('coordinatesFormatted.txt', 'w') as fout: 
    for line in f: 
     line = line.strip() 
     if line == 'atom': 
      line += str(next(c)) # get the next item from the counter 
     fout.write(line + '\n') 
+0

Ihre Lösung ist mehr Python als meine. upboting es :) Auch wenn Anfänger FORTRAN-ähnliche Sachen bevorzugen, um die Sprache zu erhalten. –

+0

@ Jean-FrançoisFabre Ich wollte nicht posten, nachdem du geantwortet hast, aber ich fühlte, dass die beiden Zähler unnötig waren. Ihre Erklärung war jedoch großartig –

+0

Sie hatten Recht, dies zu tun. Ich habe so schnell wie möglich geantwortet. Und mit deinem Beitrag bin ich derjenige, der etwas über Itertools gelernt hat. Außerdem sind wir hier, um den Leuten zu zeigen, wie man richtig programmiert und nicht nur die Probleme löst. –

Verwandte Themen