【问题标题】:Why is to_csv giving Error? [duplicate]为什么 to_csv 给出错误? [复制]
【发布时间】:2023-03-31 05:45:02
【问题描述】:

这是我的代码:

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 的原因是因为我必须将多个数据帧写入同一个文件。我正在使用计数来检查它是否是第一次写入。

【问题讨论】:

  • 请提供完整的追溯。
  • 你在用熊猫吗?你能显示完整的回溯吗——这比挑选一个短语要好得多

标签: python python-2.7 pandas dataframe


【解决方案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 并且没有转义字符会出现错误。

最好的解决方案是使用quoting=0

【讨论】:

  • 我仍然不明白为什么我需要给一个转义字符,那会做什么?你能详细说明一下吗?
  • 我已经插入了一些例子。您需要一个 escapechar,因为您的某个字段包含逗号或引号。
  • “最好的解决方案是使用 quoting=0”,由于与您尝试解决的完全相同的原因,这很少是最佳解决方案:然后可能需要引号再次读入文件时自己被转义(或者至少必须注意输入文件中有引号并相应地读取它们)。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2012-10-24
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多