2017-03-31 6 views
0

私はBGEの小さなプロジェクトで、data.txtをdata.csvファイルにインポートしようとしていて、データを2つのカラムに分割しています。Blender Game EngineでPythonでCSVデータを分割する

私のdata.txtはこのように見えます。

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

あなたが推測するように、「、」を列の区切り記号として使用します。

これは私の現在のコードです。

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]) 

データをdata.csvにインポートすることはできますが、データを1つの列にインポートすることはできません。これをどうすれば解決できますか?

+1

あなただけのファイルを直接読んで試してみました'csv.reader'オブジェクトでCSVに変換しますか?データが既にカンマ区切り形式で表示されているようです。サブセクションだけが必要な場合は、StringIOにそれをポンピングして読み取ることができます。 – theodox

+0

私は初心者ですので、csv.readerオブジェクトを使って直接ファイルを読むことが分かりません。私は自分の "reader = csv.reader(f、delimiter = '、')"がcsvリーダーであると思った。 – ricster

+0

あなたのdata.txtのサンプルはカンマで区切られています。あなたはdata.txtを読み込み、手作業でカンマで区切り、csvとして保存し直すことができます。あなたがしているのは、ファイルの先頭にID行を追加することだけです。私はあなたがしようとしているのは、data.txtから複数の行を取り、各行の2番目の列をdata.csvの列に入れることだと思いますか? var1、var2、var3に3行読み込まれ、それから 'writerow(ID、var1 [1]、var2 [1]、var3 [1])' – sambler

答えて

1

あなたの例ではフォーマットが一致している場合は、少なくとも、あなたはこの操作を行うことができます。

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

これはリストの-リストこのように、カンマ区切りのペアを収集します:

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

目的のデータが大きいファイルのサブセットの場合は、stringIOオブジェクトにコピーして、代わりにcsvリーダーに渡すことができます。それは読者にディスクファイルのように見えます。ここでは簡単な例です:

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] 

私は推測何、実際には良いラインを見つけるための基準 - あなたが唯一のカンマで区切られた行を選択するために必要なロジックを使用することができ

+0

、あなたの最初の提案(BlenderはStringIOをサポートしていません)に従い、コードをもう一度実行します。 CSVファイルのプレビューが変更されました。 http://i.imgur.com/jXhhFVC.pngでもファイルを開いたときには、すべてのデータが単一の列になっていました。 http://i.imgur.com/oVKxdvD.png – ricster

+0

ああ、Excelに関連するよく知られている問題で、CSVファイルを表示していたようです。あなたの提案は完璧に働いた、ありがとう。 – ricster