2017-03-31 3 views
0

Ich arbeite an einem kleinen Projekt in BGE und versuche, data.txt in eine data.csv-Datei zu importieren und die Daten dann in zwei Spalten aufzuteilen.CSV-Daten in Blender Game Engine mit Python teilen

Meine data.txt sieht so aus;

Breathing rate:, 1.0 
Pulse:, 140 
Spinal Injury:, Yes 

Wie Sie vermuten würden, möchte ich "," als Trennzeichen für die Spalten.

Und hier ist mein aktueller Code;

try: 
    file = open(path+"dialogue.txt", 'r') 
    info = file.readlines() 
    own.text = str(info[currentLineNumber]) 
except: 
    own.text = "end of script" 

column1 = [] 
column2 = [] 
if own ["currentLine"] == 10: 
    own.sendMessage("resume") 
    with open(path+"data.txt", 'r') as in_file: 
     stripped = (line.strip() for line in in_file) 
     datalines = (line.split(",") for line in stripped if line) 
     with open(path+"data.csv", 'w') as out_file: 
      writer = csv.writer(out_file) 
      writer.writerow(('subject', 'value')) 
      writer.writerow(('ID: ', (uuid.uuid1()))) 
      writer.writerows(datalines) 
os.rename(path+"data.csv", path+"newData.csv") 
with open('newData.csv', 'r') as f: 
    reader = csv.reader(f, delimiter=',') 
    for row in reader: 
     column1.append(row[0]) 
     column2.append(row[1]) 

ich die Daten zu data.csv importieren kann, aber ich kann die Daten in Spalten nicht geteilt, alle importierten Daten in einer einzigen Spalte. Wie kann ich das beheben?

+1

Haben Sie versucht, das Lesen nur die Datei direkt in CSV mit einem 'csv.reader' Objekt? Es scheint, als ob die Daten bereits in einem durch Kommata getrennten Format vorliegen. Wenn Sie nur einen Unterabschnitt möchten, können Sie ihn in einen StringIO pumpen und lesen, dass – theodox

+0

Ich bin ein Neuling, also bin ich mir nicht sicher, ob ich Sie über das Lesen der Datei direkt mit dem Objekt csv.reader verstehe. Ich dachte, mein "reader = csv.reader (f, delimiter = ',')" war der CSV-Reader. – ricster

+0

Ihr Beispiel von data.txt ist durch Komma getrennt, Sie lesen in data.txt und teilen es manuell auf ein Komma und speichern es als CSV, damit Sie es wieder einlesen können. Sie fügen nur die ID-Zeile zum Anfang der Datei hinzu. Ich denke, was Sie versuchen zu tun, nehmen Sie mehrere Zeilen aus data.txt und setzen Sie die zweite Spalte jeder Zeile in Spalten in data.csv? Das wäre 3 Zeilen gelesen in var1, var2, var3 und dann 'writerow (ID, var1 [1], var2 [1], var3 [1])' – sambler

Antwort

1

Zumindest, wenn das Format in Ihrem Beispiel konsistent ist, können Sie dies nur tun:

datafile = "path/to/textfile" 
with open (datafile, 'rt') as filehandle: 
    csv_reader = csv.reader(filehandle, delimiter = ',') 
    data = [row for row in csv_reader] 

dies die durch Kommata getrennte Paare in eine Liste-of-Listen wie diese sammeln:

[['Breathing rate:', ' 1.0'], ['Pulse:', ' 140'], ['Spinal Injury:', ' Yes']] 

Wenn die gewünschten Daten eine Teilmenge der größeren Datei sind, können Sie sie in ein stringIO Objekt kopieren und dieses stattdessen an den CSV-Leser übergeben; es wird für den Leser wie eine Disk-Datei aussehen. Hier ist ein einfaches Beispiel:

import StringIO 
filtered_data = StringIO.StringIO() 
with open(datafile, 'rt') as originalfile: 
    for line in originalfile: 
     if ":," in line: # your real criteria would go here... 
      filtered_data.write(line.strip() + "\n") 

# rewind to beginning of your stringIO 
filtered_data.seek(0) 
csv_reader = csv.reader(filtered_data, delimiter = ',') 
data = [row for row in csv_reader] 

ich nur ahnen, was die Kriterien für die Suche nach wirklich guten Linien - Sie jede Logik verwenden könnten Sie benötigten nur durch Kommata getrennte Linien holen

+0

Lustiges ist passiert; Ich folgte Ihrem ersten Vorschlag (Blender hat keine Unterstützung für StringIO) und führen den Code erneut aus. Die Vorschau der CSV-Datei hat sich geändert. http://i.imgur.com/jXhhFVC.png, aber als ich die Datei öffnete, waren noch alle Daten in einer einzigen Spalte; http://i.imgur.com/oVKxdvD.png – ricster

+0

Nun gut, es sieht so aus, als wäre ein Excel-Problem für die Anzeige von CSV-Dateien bekannt. Ihr Vorschlag hat perfekt funktioniert, danke. – ricster