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()
的关键字)。
不幸的是,Numbers.app
对引用单元格的解释看起来可能只是一个问题; .csv
文件会相应地上传到Google云端硬盘,如果重新下载为excel文件,则会在Numbers.app
中正确打开。
Google Drive技巧让我意识到这一点。工作。确实如此。首先,pip3 install xlrd xlwt-future
。然后:df.to_excel('fake.xls')
。像我希望的那样在数字中打开,就像那样简单。
答案 0 :(得分:0)
根据我上面的编辑,看起来这是Numbers.app
处理引用单元格而不是单元格本身的问题。
我的解决方案:
pip3 install xlrd xlwt-future
df.to_excel('fake.xls')
但是,如果有人有办法在Pandas中执行每列引用规则,我仍然会将其标记为正确答案,因为这是我原来的问题。