2016-10-25 5 views
1

Ich habe versucht, die zweite Spalte der Eingabedatei aufzulisten, aber mein Code gibt den folgenden Fehler. Wie kann ich meinen Code reparieren, um die folgende Ausgabedatei zu erhalten?wie eine bestimmte Spalte einer Datei zu nummerieren

Fehler:

Traceback (most recent call last): File "./rename_atoms.py", line 7, in print(item+index) TypeError: cannot concatenate 'str' and 'int' objects

Mein Code:

#!/usr/bin/python 

with open ('input.gro', 'r') as f: 
    for line in f: 
     column=line.split() 
     for index, item in enumerate(column[1]): 
      print(item+index) 

Eingabedatei:

GRoups of Organic Molecules in ACtion for Science 
    18 
    1LIG  O 1 1.665 1.740 8.646 
    1LIG  O 2 0.877 2.044 7.947 
    1LIG  S 3 1.469 1.778 8.501 
    1LIG  S 4 1.340 1.695 8.487 
    1LIG  S 5 1.231 1.770 8.412 
    1LIG  N 6 1.282 1.801 8.268 
    1LIG  C 7 1.553 1.679 8.585 
    1LIG  C 8 1.523 1.805 8.360 
    1LIG  C 9 1.313 1.647 8.630 
    1LIG  H 10 1.418 1.875 8.271 
    1LIG  H 11 1.454 1.624 8.688 
    1LIG  H 12 1.100 1.691 8.403 
    1LIG  H 13 1.453 1.912 8.577 
    1LIG  H 14 1.174 1.869 8.184 
    1LIG  H 15 0.992 1.777 8.339 
    1LIG  H 16 1.037 1.853 8.217 
    1LIG  H 17 1.206 1.941 8.068 
    1LIG  H 18 0.939 1.914 8.137 
     0.00000 0.00000 0.00000 

Wunschausgabedatei:

GRoups of Organic Molecules in ACtion for Science 
    18 
    1LIG  O1 1 1.665 1.740 8.646 
    1LIG  O2 2 0.877 2.044 7.947 
    1LIG  S1 3 1.469 1.778 8.501 
    1LIG  S2 4 1.340 1.695 8.487 
    1LIG  S3 5 1.231 1.770 8.412 
    1LIG  N1 6 1.282 1.801 8.268 
    1LIG  C1 7 1.553 1.679 8.585 
    1LIG  C2 8 1.523 1.805 8.360 
    1LIG  C3 9 1.313 1.647 8.630 
    1LIG  H1 10 1.418 1.875 8.271 
    1LIG  H2 11 1.454 1.624 8.688 
    1LIG  H3 12 1.100 1.691 8.403 
    1LIG  H4 13 1.453 1.912 8.577 
    1LIG  H5 14 1.174 1.869 8.184 
    1LIG  H6 15 0.992 1.777 8.339 
    1LIG  H7 16 1.037 1.853 8.217 
    1LIG  H8 17 1.206 1.941 8.068 
    1LIG  H9 18 0.939 1.914 8.137 
     0.00000 0.00000 0.00000 

Antwort

1

Das Problem in dieser Linie ist:

for index, item in enumerate(column[1]): 
>>  print(item+index) 

Sie versuchen, ein int (index) und einen String (item) hinzuzufügen. Wenn Sie nur sie zusammen gedruckt werden sollen, einfach tun:

print(item, index) 

Beachten Sie, dass dies ein Leerzeichen zwischen den Argumenten standardmäßig hinzufügen. Um dies zu entfernen, verwenden Sie das Argument sep und legen Sie es auf eine leere Zeichenfolge fest.

Dies ist jedoch wahrscheinlich nicht das, was Sie wollen, wie der Ausgang so etwas wie sein würde:

O 0 
O 0 
S 0 

... und so weiter.

dies also tun:

for i, l in enumerate(f): 
    column = l.split() 
    print(column[1],i,sep='') 

Dieses so etwas wie sein:

O0 
O1 
S2 

... und so weiter.

Fast da. Um die gewünschte Ausgabe zu erhalten, müssen wir die Anzahl der einzelnen Elemente beibehalten. Also, versuchen Sie so etwas wie dieses:

from collections import defaultdict 

counts = defaultdict(int) 
for l in f: 
    column = l.split() 
    counts[column[1]] += 1 
    print(column[1], counts[column[1]], sep="") 

Dieser Druck sollte:

O1 
O2 
S1 

... und so weiter.

+0

Ihr Code gibt diesen Fehler: "Datei" ./rename_atoms.py ", Zeile 9 print (Spalte [1], zählt [Spalte [1]], sep = '') SyntaxError: ungültige Syntax. Es zeigt 'sep = ''' – qasim

+1

Wenn das der Fall ist, bitte markieren Sie die Frage mit 'python2' und verwenden Sie' print column [1] + str (zählt [Spalte [1]]) 'stattdessen – ThatWeirdo

+0

Es funktioniert jetzt . Aber wie bekomme ich die gewünschte Ausgabedatei (siehe die gewünschte Ausgabedatei am Ende der Frage)? – qasim

0

Sie können ein int und eine Zeichenfolge nicht verketten. Sie sind inkompatible Typen für die Funktion +. Sie müssen Ihren Index von int in string konvertieren und dann verketten. In Zeile 7 versuchen:

 print(item+str(index)) 
+0

Ich habe es getan, aber die Code druckt diese 'O0 O0 S0 S0 S0 N0 C0 C0 C0 H0 H0 H0 H0 H0 H0 H0 H0 H0', was ich nicht will. – qasim

Verwandte Themen