2016-08-21 242 views
-2

這是我的代碼:爲什麼to_csv給出錯誤?

with open('myData', 'a') as f: 
    if count1 == 1: 
     df.to_csv(f,index=False, quoting=3) 
    else: 
     df.to_csv(f,index=False, quoting=3 , header = False) 


Error: need to escape, but no escapechar set 

我怎樣才能解決這個問題呢?我想我需要改變報價爲None,引號字符爲「「」我在正確的方向前進

這是完整的回溯:?

--------------------------------------------------------------------------- 
Error          Traceback (most recent call last) 
<ipython-input-22-7b964e5d0ae8> in <module>() 
27   action.perform() 
28   html = browser.page_source 
---> 29   ScrapePage(html) 

<ipython-input-20-1d50d699fe76> in ScrapePage(html) 
56  with open('myData', 'a') as f: 
57   if count1 == 1: 
---> 58    df.to_csv(f,index=False, quoting=3) 
59   else: 
60    df.to_csv(f,index=False, quoting=3 , header = False) 

C:\Anaconda2\lib\site-packages\pandas\core\frame.pyc in to_csv(self, path_or_buf, sep, 
na_rep, float_format, columns, header, index, index_label, mode, encoding, compression, 
quoting, quotechar, line_terminator, chunksize, tupleize_cols, date_format, doublequote, 
escapechar, decimal, **kwds) 

1330          escapechar=escapechar, 
1331          decimal=decimal) 
-> 1332   formatter.save() 
1333 
1334   if path_or_buf is None: 

C:\Anaconda2\lib\site-packages\pandas\core\format.pyc in save(self) 
1504 
1505    else: 
-> 1506     self._save() 
1507 
1508   finally: 

C:\Anaconda2\lib\site-packages\pandas\core\format.pyc in _save(self) 
1604     break 
1605 
-> 1606    self._save_chunk(start_i, end_i) 
1607 
1608  def _save_chunk(self, start_i, end_i): 

C:\Anaconda2\lib\site-packages\pandas\core\format.pyc in _save_chunk(self, start_i, end_i) 
1631           quoting=self.quoting) 
1632 
-> 1633   lib.write_csv_rows(self.data, ix, self.nlevels, self.cols, self.writer) 
1634 
1635 # from collections import namedtuple 

pandas\lib.pyx in pandas.lib.write_csv_rows (pandas\lib.c:19840)() 

Error: need to escape, but no escapechar set 

原因在if: else:寫入CSV是因爲我必須寫多個數據幀到同一個文件,我用count來檢查它是否第一次寫入

+1

請提供完整的回溯。 – albert

+0

你在使用熊貓嗎?你能否展示完整的追蹤 - 最好挑選一個短語 –

回答

1

選項quoting=3相當於quoting=csv.QUOTE_NONE它是一個永遠不會引用字段的指令。任何字段都包含分隔符(逗號),然後逗號將不得不逃脫。但是,沒有設置escapechar,這會產生錯誤。 Documentation for csv quote constants

例如,您可以設置一個escapechar df.to_csv(f,index=False, quoting=3, escapechar=r'\')以使用反斜槓來轉義出現的任何逗號,或者可以使用不同的引號值。 quoting=csv.QUOTE_MINIMAL(或quoting=0)將僅使用需要它們的字段的引號。

舉一個具體的例子,假設你有兩行兩列的數據幀:

2015 "eggs and spam" 
2016 "eggs, bacon and spam" 

quoting=0 csv文件你(引號繞場使用含有逗號)

2015,eggs and spam 
2016,"eggs, bacon and spam" 

隨着quoting=3, escapechar=r"\"你:(用於轉義逗號 「\」)

2015,eggs and spam 
2016,eggs\, bacon and spam 

quoting=3並沒有escapechar你會得到一個錯誤。

最好的解決辦法是使用quoting=0

+0

我還是不明白爲什麼我需要給一個逃生角色,那會做什麼?你能再詳細一點嗎? – EL323

+0

我已經插入了一些例子。您需要一個escapechar,因爲其中一個字段包含逗號或引號。 –

+0

*「最好的解決方案是使用quoting = 0」*,這很少是最好的解決方案,因爲您試圖解決這個問題的原因完全相同:在再次讀取文件時引號可能需要自行轉義(或至少有一個人必須注意輸入文件中有引號並相應地讀取它們)。 – gented