2013-12-09 56 views
2

我有一段代碼。我想分開日期:07/12/13並將其寫入csv file.but但我無法從列表中分離元素,我測試了py腳本的工作正常,當我運行腳本給出錯誤的列表組件。從列表中分離值並寫入CSV文件

def main(): 
    pass 

if __name__ == '__main__': 
    main() 
    count=0 
    f=open("test.csv","w+"); 
    result = csv.writer(f,delimiter=',', dialect='excel-tab') 

    result_statememt=("date","time","Zenith","Azimuth","Elevation","conv_elevation"); 
    result.writerow(result_statememt) 
    f.close() 
    while(count<5): 
     #time.sleep(60) 
     ser=serial.Serial() 
     ser.port=2 
     ser.baudrate=9600 
     ser.open() 
     str=ser.read(109) 
     print str 
     val=str.split(":") 
     print val 
     print "\n" 
     lines=str.split("\r\n") 
     print lines 
     wst=[] 

     print line 
     wst=[] 
    for line in lines[:]: 
       line=lines.split(":") 
       print line 

     f=open("test.csv","a+") 
     result=csv.writer(f,delimiter=',') 

     count=count+1 



     #lines=str.split("\r\n") 

     #print count 
     #f=open("test.txt","a+") 
     #result=csv.writer(f,delimiter=',') 
     #result.writerow() 
     f.close() 

    f.close() 
    ser.close() 

程序的輸出窗口。

Serial.port received data: 
date is:7/12/16 
time is:24-0-0 
Zenith:104.85 
Azimuth:110.40 
Elevation:-14.85 
Converted Elevation:15.79 
val out put : 
['date is', '7/12/16\r\ntime is', '24-0-0\r\nZenith', '104.85\r\nAzimuth', '110.40\r\nElevation', '-14.85\r\nConverted Elevation', '15.79\r\n'] 
lines output: 

['date is:7/12/16', 'time is:24-0-0', 'Zenith:104.85', 'Azimuth:110.40', 'Elevation:-14.85', 'Converted Elevation:15.79', ''] 
+1

1.什麼錯誤? 2.哪個python? 3.修復縮進。 – sashkello

+2

[你們都是從哪裏得到這個糟糕的代碼?](http://stackoverflow.com/questions/20440337/writing-into-csv-file-using-python)我真的希望它不是你的教授。 –

回答

0

的代碼中的相關缺失位是:

import csv 
with open('some.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerows(someiterable) 

您是與可重複的失敗這樣寫。你也應該只打開一次文件並關閉它一次

0

這裏是我的理解你的問題:從串口

  • 讀取數據
  • 數據由6條線
  • 每行包括標籤(例如「日期」),一冒號和一個值(例如,「16年7月12日」)
  • 你想要捕捉的值,並將其寫入到一個CSV文件(頭)

讓我們開始與T在我們可以處理更多數據之前處理一組數據(6行)。我的理解,一組數據可能看起來像:

date is:7/12/16 
time is:24-0-0 
Zenith:104.85 
Azimuth:110.40 
Elevation:-14.85 
Converted Elevation:15.79 

的線是\r\n,但它並沒有多大關係。假裝我們由獲得的數據:

>>> data = 'date is:7/12/16\r\ntime is:24-0-0\r\nZenith:104.85\r\nAzimuth:110.40\r\nElevation:-14.85\r\nConverted Elevation:15.79' 

如果我們分裂由線的數據:

>>> data.splitlines() 
['date is:7/12/16', 'time is:24-0-0', 'Zenith:104.85', 'Azimuth:110.40', 'Elevation:-14.85', 'Converted Elevation:15.79'] 

現在,我們可以分割在結腸的每一行:

>>> [line.split(':')[1] for line in data.splitlines()] 
['7/12/16', '24-0-0', '104.85', '110.40', '-14.85', '15.79'] 

上面說,*對於我們的數據中的每一行,我們在冒號處分割該行並取第二部分(第一部分在索引0處,第二部分在索引1處)。這是我們要寫入輸出文件的行。

現在我們知道如何處理這條線了,我們可以把它放在一個循環中(在你的情況下是5次)。此外,我通過將串行端口啓動代碼放在一邊來清理代碼。那樣,我們只初始化一次並關閉一次。這裏是代碼:

import csv 

if __name__ == '__main__': 
    # Init serial line 
    ser = serial.Serial() 
    ser.port = 2 
    ser.baudrate = 9600 
    ser.open() 

    with open('test.csv', 'w+') as f: 
     result = csv.writer(f, delimiter=',', dialect='excel') 
     result.writerow(['date','time','Zenith','Azimuth','Elevation','conv_elevation']); 
     for count in range(5): 
      data = ser.read(109) 
      row = [line.split(':')[1] for line in data.splitlines()] 
      result.writerow(row) 

    ser.close() 
+0

感謝這段代碼幫了我很多 – AMPS