Pandas可以使用特定于列的引用导出.csv吗?

时间:2014-02-28 03:34:52

标签: python python-3.x pandas

OSX 10.9.2
Python 3.3.4
熊猫0.13.1
csv 1.0

我正在使用Pandas来操纵.csv然后我希望使用.to_csv()函数将导出返回到csv,以便其他人可以在各种电子表格中打开它应用。然而,引用搞乱了一切。问题是我的一个列将是电子表格应用程序中的超链接(OSX 10.9.2上的Numbers.app 3.1),它使用格式=hyperlink("URL", "Link Text"); pd.to_csv()默认为quoting = csv.QUOTE_MINIMAL,它会尝试引用超链接中的",这会混淆Numbers.app。

使用quoting = csv.QUOTE_NONE会产生有关escapechar未设置的错误;设置escapechar = '|'(或任何字符),无论如何都会产生Error: need to escape, but no escapechar set

例如,

import pandas as pd
df = pd.DataFrame([['Boring column', '=hyperlink("http://stackoverflow.com", "Exciting column"']])
df.to_csv('fake.csv')

!cat fake.csv
# ,0,1
# 0,Boring column,"=hyperlink(""http://stackoverflow.com"", ""Exciting column"""

import csv
df.to_csv('fake.csv', quoting = csv.QUOTE_NONE)
# Error: need to escape, but no escapechar set

df.to_csv('fake.csv', quoting = csv.QUOTE_NONE, escapechar = "^")
# Error: need to escape, but no escapechar set

即使我可以让csv.QUOTE_NONE工作,也有一些列可以使用某些QUOTE_MINIMAL。理想情况下,我可以在每列的基础上设置引用。有没有办法做到这一点?

我认为我最好的替代方案是使用csv.writer进行一些循环和一些手动编写,或者可能只是老式的writelines()。只是看起来很遗憾 - 到目前为止,我认为Pandas是梦幻般的,似乎有一种更好的方法来做到这一点。

编辑:

我认为通过使用:

巧妙地避免了这个问题
df.to_csv('fake.csv'), quoting = csv.QUOTE_NONE, sep = '\t')

with open('fake.csv', 'r') as r:
    lines = [line.replace('\t', ',') for line in r.readlines()]

with open('fake.csv', 'w') as w:
    w.writelines(lines)

不幸的是,这(因为它应该)使所有内容不加引号,包括,在某些列和=hyperlink("URL", "text")中,这会不恰当地拆分这些单元格。还尝试使用quotechar = "'",但遗憾的是它似乎什么都不做(显然只是pd.read_csv()的关键字)。

解决方法1:Google云端硬盘

不幸的是,Numbers.app对引用单元格的解释看起来可能只是一个问题; .csv文件会相应地上传到Google云端硬盘,如果重新下载为excel文件,则会在Numbers.app中正确打开。

解决方法2:导出到Excel

Google Drive技巧让我意识到这一点。工作。确实如此。首先,pip3 install xlrd xlwt-future。然后:df.to_excel('fake.xls')。像我希望的那样在数字中打开,就像那样简单。

1 个答案:

答案 0 :(得分:0)

根据我上面的编辑,看起来这是Numbers.app处理引用单元格而不是单元格本身的问题。

我的解决方案:

  1. pip3 install xlrd xlwt-future
  2. df.to_excel('fake.xls')
  3. 以数字打开
  4. 但是,如果有人有办法在Pandas中执行每列引用规则,我仍然会将其标记为正确答案,因为这是我原来的问题。