2017-08-17 20 views
3

csvファイルをプログラムに読み込もうとしていますが、次の4つのエラーが表示されます。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 '] 値= dictの(ZIP(:csv_readerにおける行の csv_reader = csv.reader(FD、方言= csv.excel) ヘッダ=次(csv_reader) :FDとして(ファイル名、モード= "RB")オープンと except: traceback.print_exc() 最後に 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:[CSV on PyMOTW](https://pymotw.com/2/csv/)も読んでください。 –

関連する問題