2014-01-28 64 views
1

我有這段代碼用於從串口連接的機器收集數據,然後重新排序數據。 我可以成功地在最後打印我的數據:print pigment_dataPython 2.7導出數據在.csv中

但是我不明白怎麼出口這個數據到.csv文件。

有沒有簡單的方法來做到這一點?

非常感謝你,

阿德里安

import serial # requires pyserial library 
import csv 

ser = serial.Serial(0) 
data = [] 

while True: 
    name = raw_input("Pigment name [DONE to finish]: ") 
    if name == "DONE": 
     break 

    pigment_data = [] 
    first = True 
    main_spect = [] 

    while True: 
     line = ser.readline() 
     if first: 
      print " Data incoming..." 
      first = False 
     split = line.split() 
     if 10 <= len(split): 
      try: 
       wavelength = int(split[0]) 
       measurements = [float(split[i]) for i in [2,4,6,8,10]] 
       pigment_data.append({"wavelength": wavelength, 
            "measurements": measurements}) 
       main_spect.append(measurements[2]) 
      except ValueError: 
       pass # handles the table heading 
     if line[:3] == "110": 
      break 
    data.append({"name": name, 
       "data": pigment_data}) 
    print " Data gathered." 
    print pigment_data 

    # here's the problem: 
    with open('spectral_data.csv', 'wb') as f: 
     writer = csv.writer(f) 
     writer.writerows(pigment_data) 
+1

你說「這是問題」,但* *是什麼?錯誤(提供追溯)?意想不到的產出(提供投入,產出,預期產出)?一方面,你實際上並沒有把任何東西傳遞給'writerows()' – jonrsharpe

+0

正確,抱歉,我的錯誤(見編輯) –

+0

你只談到了我提出的最後一點,其他問題呢? – jonrsharpe

回答

3

您蒐集的詞典列表,使用csv.DictWriter()這裏,而不是使它更容易些:

with open('spectral_data.csv', 'ab') as f: 
    writer = csv.DictWriter(f, ('name', 'data')) 
    writer.writerow(data[-1]) 

這將打開附加的文件模式,因爲每個循環都打開一次文件。我在這裏使用了data[-1],因爲這是您在循環中添加的最後一個條目。

你可能想移動writer對象的創造出你的循環

with open('spectral_data.csv', 'wb') as f: 
    writer = csv.DictWriter(f, ('name', 'data')) 

    while True: 
     name = raw_input("Pigment name [DONE to finish]: ") 
     # .... 

     print pigment_data 

     writer.writerow(data[-1]) 

其寫入你聚集到CSV文件您收集其最新的一項。

最後但並非最不重要的,你也可以外while True:後寫一氣呵成整個data列表完成:

data = [] 

while True: 
    name = raw_input("Pigment name [DONE to finish]: ") 
    # .... 

with open('spectral_data.csv', 'ab') as f: 
    writer = csv.DictWriter(f, ('name', 'data')) 
    writer.writerows(data) 
0

csv.writer的幫助:

writer(...) 
    csv_writer = csv.writer(fileobj [, dialect='excel'] 
           [optional keyword args]) 
     for row in sequence: 
      csv_writer.writerow(row) 

     [or] 

     csv_writer = csv.writer(fileobj [, dialect='excel'] 
           [optional keyword args]) 
     csv_writer.writerows(rows) 

    The "fileobj" argument can be any object that supports the file API. 

所以基本上你想要:

with open('spectral_data.csv', 'wb') as f: 
    writer = csv.writer(f) 
    for row in pigment_data: 
     writer.writerow(row)