2017-08-17 83 views
3

我想讀取一個csv文件到一個程序中,我得到以下四個錯誤。讀取csv文件時出現「未加引號的字段中顯示的新行字符」錯誤

File "/Users/interpott/Downloads/SatStressGUI-master/Contents/Resources/satstressgui.py", line 2173, in load 
File "/Users/interpott/Downloads/SatStressGUI-master/Contents/Resources/satstressgui.py", line 891, in file_dialog 
File "/Users/interpott/Downloads/SatStressGUI-master/Contents/Resources/satstressgui.py", line 887, in file_dir_dialog 
File "/Users/interpott/Downloads/SatStressGUI-master/Contents/Resources/satstressgui.py", line 2203, in load_entries 
Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode? 

代碼片段:

def load(self, evt): 
    try: 
     file_dialog(self, 
        message=u"Load from CSV file", 
        style=wx.OPEN, 
        wildcard='CSV files (*.csv)|*.csv', 
        action=self.load_entries) **2173** 
    except Exception, e: 
     traceback.print_exc() 

def set_num_rows(self,num_rows): 
    self.pp.SetRows(num_rows) 
    self.sp.SetRows(num_rows) 
    self.tp.SetRows(num_rows) 
    if (num_rows > self.rows): 
     for j in range(num_rows-self.rows): 
      self.add_row(self.fieldPanel,self.pp, self.header1, '0') 
      self.add_row(self.fieldPanel,self.tp, self.header2, '') 
      self.add_row(self.fieldPanel,self.sp, self.header3, '') 
     self.update_parameters() 
    else: 
     for j in range(self.rows-num_rows): 
      for p,d in self.header1+self.header2+self.header3: 
       self.parameters[p][-1].Destroy() 
       del self.parameters[p][-1] 
       del self.sc.parameters[p][-1] 
    self.rows = num_rows 
    self.row_ctrl.SetValue(num_rows) 
    self.spin_value = num_rows 
    self.sc.set_parameter('point_rows',self.rows) 
    self.fieldPanel.Layout() 
    self.fieldPanel.SetupScrolling() 

def load_entries(self, filename): 
    f = open(filename) 
    csvreader = csv.reader(f, dialect=csv.excel_tab) 
    coord = csvreader.next() #Skip headers. **2203** 
    data = list(csvreader) 
    self.set_num_rows(len(data)) 
    try: 
     keys = ['theta', 'phi', 't', 'orbit'] 

     for i,coord in enumerate(data): 

      for key in keys: 
       val = coord[keys.index(key)] 
       self.parameters[key][i+1].SetValue(val) 
       self.sc.set_parameter(key, val, point = i+1) 
    except: 
     traceback.print_exc() 
    finally: 
     f.close() 
     self.fieldPanel.Layout() 
     self.fieldPanel.SetupScrolling() 
     self.Layout() 

我嘗試了一些共同的建議。任何人都可以告訴我我在哪裏搞亂了嗎?

樣品CSV以下文件:

theta [degrees],phi [degrees],t [yrs],orbital pos [degrees],Stt [kPa],Spt [kPa],Spp [kPa],sigma1 [kPa],sigma3 [kPa],alpha [degrees] 
10,10,0,0,,,,,, 
10,10,1000,0,,,,,, 
10,10,2000,0,,,,,, 
10,10,3000,0,,,,,, 
10,10,4000,0,,,,,, 
10,10,5000,0,,,,,, 
10,10,6000,0,,,,,, 
10,10,7000,0,,,,,, 
10,10,8000,0,,,,,, 
10,10,9000,0,,,,,, 
10,10,10000,0,,,,,, 
10,10,11000,0,,,,,, 
10,10,12000,0,,,,,, 
10,10,13000,0,,,,,, 
10,10,14000,0,,,,,, 
10,10,15000,0,,,,,, 
10,10,16000,0,,,,,, 
10,10,17000,0,,,,,, 
10,10,18000,0,,,,,, 
10,10,19000,0,,,,,, 
10,10,20000,0,,,,,, 
10,10,21000,0,,,,,, 
10,10,22000,0,,,,,, 
10,10,23000,0,,,,,, 
10,10,24000,0,,,,,, 
10,10,25000,0,,,,,, 
+0

如果你使用Python 3,你應該打開CSV文件時,使用'開放式閱讀( filename,newline ='')',如文檔中的示例所示。同樣,對於Python 2,您應該使用'open(filename,'rb')'。 – martineau

回答

0

那麼,有在你的代碼中的一些錯誤:

首先,CSV分隔符不標籤逗號,因此受到Excel更換方言:

dialect=csv.excel 

在Python2中,你需要打開你的CSV文件二進制模式。

文件的閱讀可以做如下:

import csv 

keys = ['theta', 'phi', 't', 'orbit'] 

with open(filename, mode="rb") as fd: 
    csv_reader = csv.reader(fd, dialect=csv.excel) 
    header = next(csv_reader) 
    for row in csv_reader: 
     values = dict(zip(keys, row[:len(keys)])) 
     print(values) 

此打印:

{'theta': '10', 'phi': '10', 't': '0', 'orbit': '0'} 
{'theta': '10', 'phi': '10', 't': '1000', 'orbit': '0'} 
{'theta': '10', 'phi': '10', 't': '2000', 'orbit': '0'} 
{'theta': '10', 'phi': '10', 't': '3000', 'orbit': '0'} 
{'theta': '10', 'phi': '10', 't': '4000', 'orbit': '0'} 
{'theta': '10', 'phi': '10', 't': '5000', 'orbit': '0'} 
[...] 
+0

感謝您的回覆。我按照你的建議做了,但是它不喜歡我正在做的事情: def load_entries(self,filename): import csv keys = ['theta','phi','t','orbit'] 具有開放(文件名,模式= 「RB」)作爲FD: csv_reader = csv.reader(FD,方言= csv.excel) 頭=下一個(csv_reader) 爲行中csv_reader: 值=字典(郵編(除了: traceback.print_exc() finally: filename.close() –

+0

@JonKay:您需要了解什麼是['with'](https:/ /docs.python.org/2/reference/compound_stmts.html#the-with-statement)語句:https://stackoverflow.c om/documentation/python/928 –

+0

@JonKay:你也應該考慮閱讀[PyMOTW上的CSV](https://pymotw.com/2/csv/) –

相關問題