Konvertieren von Leerzeichen-getrennte Datei durch Komma getrennte Werte-Datei in python
Ich bin ganz neu bei Python. Ich weiß, dass das schon gefragt wurde, und ich entschuldige mich, aber der Unterschied in dieser neuen situation ist, dass Leerzeichen zwischen den strings nicht gleich sind. Ich habe eine Datei namens " coord, enthält die folgenden durch Leerzeichen getrennte strings:
1 C 6.00 0.000000000 1.342650315 0.000000000
2 C 6.00 0.000000000 -1.342650315 0.000000000
3 C 6.00 2.325538562 2.685300630 0.000000000
4 C 6.00 2.325538562 -2.685300630 0.000000000
5 C 6.00 4.651077125 1.342650315 0.000000000
6 C 6.00 4.651077125 -1.342650315 0.000000000
7 C 6.00 -2.325538562 2.685300630 0.000000000
8 C 6.00 -2.325538562 -2.685300630 0.000000000
9 C 6.00 -4.651077125 1.342650315 0.000000000
10 C 6.00 -4.651077125 -1.342650315 0.000000000
11 H 1.00 2.325538562 4.733763602 0.000000000
12 H 1.00 2.325538562 -4.733763602 0.000000000
13 H 1.00 -2.325538562 4.733763602 0.000000000
14 H 1.00 -2.325538562 -4.733763602 0.000000000
15 H 1.00 6.425098097 2.366881801 0.000000000
16 H 1.00 6.425098097 -2.366881801 0.000000000
17 H 1.00 -6.425098097 2.366881801 0.000000000
18 H 1.00 -6.425098097 -2.366881801 0.000000000
Bitte, beachten Sie die Leerzeichen vor dem start jeder string in der ersten Spalte. Also habe ich versucht die folgenden in der Reihenfolge der Konvertierung in csv:
with open('coord') as infile, open('coordv', 'w') as outfile:
outfile.write(infile.read().replace(" ", ", "))
# Unneeded columns are deleted from the csv
input = open('coordv', 'rb')
output = open('coordcsvout', 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
if row:
writer.writerow(row)
input.close()
output.close()
with open("coordcsvout","rb") as source:
rdr= csv.reader( source )
with open("coordbarray","wb") as result:
wtr= csv.writer(result)
for r in rdr:
wtr.writerow( (r[5], r[6], r[7]) )
Wenn ich das Skript ausführen, erhalte ich folgende für die coordv im ersten Teil des scripts, das ist natürlich ganz falsch:
, 1, C, , , 6.00, , 0.000000000, , 1.342650315, , 0.000000000
, 2, C, , , 6.00, , 0.000000000, -1.342650315, , 0.000000000
, 3, C, , , 6.00, , 2.325538562, , 2.685300630, , 0.000000000
, 4, C, , , 6.00, , 2.325538562, -2.685300630, , 0.000000000
, 5, C, , , 6.00, , 4.651077125, , 1.342650315, , 0.000000000
, 6, C, , , 6.00, , 4.651077125, -1.342650315, , 0.000000000
, 7, C, , , 6.00, -2.325538562, , 2.685300630, , 0.000000000
, 8, C, , , 6.00, -2.325538562, -2.685300630, , 0.000000000
, 9, C, , , 6.00, -4.651077125, , 1.342650315, , 0.000000000
, 10, C, , , 6.00, -4.651077125, -1.342650315, , 0.000000000
, 11, H, , , 1.00, , 2.325538562, , 4.733763602, , 0.000000000
, 12, H, , , 1.00, , 2.325538562, -4.733763602, , 0.000000000
, 13, H, , , 1.00, -2.325538562, , 4.733763602, , 0.000000000
, 14, H, , , 1.00, -2.325538562, -4.733763602, , 0.000000000
, 15, H, , , 1.00, , 6.425098097, , 2.366881801, , 0.000000000
, 16, H, , , 1.00, , 6.425098097, -2.366881801, , 0.000000000
, 17, H, , , 1.00, -6.425098097, , 2.366881801, , 0.000000000
, 18, H, , , 1.00, -6.425098097, -2.366881801, , 0.000000000
Habe ich versucht, verschiedene Möglichkeiten .ersetzen, ohne Erfolg, und so weit ich habe nicht gefunden eine Quelle von Informationen darüber, wie ich dies tun könnte. Was wäre der beste Weg, um eine Komma-separierte Werte aus dieser coord - Datei? Was mich interessiert ist mit dann die csv-Modul in python zu wählen Spalten, 4:6 und schließlich verwenden numpy importieren Sie wie folgt:
from numpy import genfromtxt
cocmatrix = genfromtxt('input', delimiter=',')
Ich würde mich sehr freuen, wenn jemand mir helfen könnte mit diesem problem.
sed -r 's/^\s+//;s/\s+/,/g' coord
- Wenn der alleinige Zweck ist nur zum konvertieren von einem Typ in einen anderen, bash-Skript würde einfach sein, Recht?
- Ich weiß, wie Sie sed, awk, bash-scripting, etc. Aber mein Zweck ist nicht nur zum konvertieren von einem Typ-Datei zu einer anderen. Ich bin mit der Verarbeitung der output-Datei von einem quantum chemistry Programm einige Operationen zu tun, um zu automatisieren später viele Berechnungen basieren auf der Betrachtung der Mitte der Ladungen lokalisiert molekularen orbitalen.
- Es sieht aus wie eine Feste Breite-Datei (fields in set-position). Hier ist die Frage, die sich auf Feste breiten: stackoverflow.com/questions/4914008/..., alternativ könnte man aufschneiden, um es zu teilen bis stackoverflow.com/questions/509211/pythons-slice-notation
Du musst angemeldet sein, um einen Kommentar abzugeben.
ersetzen Sie Ihre erste bit mit diesem.
es ist nicht super schön, aber es wird Ihnen eine csv-format.
wenn man will das outfile haben alles auf verschiedenen Linien, die Sie hinzufügen könnte
outfile.write("\n")
am Ende der for-Schleife, aber ich glaube nicht, dass Ihr code, der folgt diese Arbeit wird, wie die.['', '', '', '1', '', 'C', '', '', '', '', '', '', '6.00', '', '', '', '0.000000000', '', '', '', '1.342650315', '', '', '', '0.000000000']
für die erste Zeile. -1 weil es nicht funktioniert.Können Sie csv:
.strip()
ist hier überflüssig;line.split()
bereits tut.Können Sie python pandas, die ich geschrieben habe, Ihre Daten zu
data.csv
:Die große Sache über dieses ist zum Zugriff auf die zugrunde liegenden numpy-array können Sie
df.values
:Speichern der Daten-frame mit Komma-Trennzeichen:
Pandas ist eine große Bibliothek, für die Verwaltung großer Mengen von Daten, als bonus, es funktioniert gut mit numpy. Es ist auch eine sehr gute chance, dass dies viel schneller als mit der
csv
Modul.Warum nicht, zum Lesen einer Datei Zeile für Zeile? Aufteilen einer Zeile in einer Liste wieder eine Liste mit ','.
Dem csv-Modul ist gut, oder hier ist ein Weg, dies zu tun, ohne: