用python创buildexcel兼容的CSV文件?

我正在尝试使用真正的Excel兼容的Python创build一个CSV文件(我使用Excel 2007,如果这有什么区别)。

这是我想要做的事情

import csv data = [ ['9-1', '9-2', '9-3'] ] fd = open('test.csv', 'wb') try: writer = csv.writer(fd, dialect='excel', quotechar='"', quoting=csv.QUOTE_ALL) writer.writerows(data) finally: fd.close() 

这将创build一个csv文件,其中包含:

 "9-1","9-2","9-3" 

当我在Excel中加载时,我得到的列:

 09-Jan 09-Feb 09-Mar 

[Grrr,谢谢Excel。 严重的是,什么是引号?]

现在,我已经在其他地方读到了,为了让Excel将string视为字面值,它们必须以等号="Like This"作为前缀。 所以我真正想要产生的是:

 ="9-1",="9-2",="9-3" 

有没有办法做到这一点与python的csv模块? 我猜这将涉及到创build一个自定义的方言 ,但我看不到任何变数,会给我想要的结果。

FWIW,Excel 2007甚至不兼容本身。 如果您在空电子表格中input9-1,则只要您离开单元格,就会将其转换为1-Sep。 如果将单元格格式从“常规”更改为“文本”,则可以不改变地inputstring文本并将其保存为.csv文件,但是当您将相同的文件读入空白电子表格(使用常规格式)时,它会被重新转换为date。

Excel将文件保存为

 9-1,9-2,9-3 

没有引号,没有“=”号。 即使将单元格格式设置为Text,然后再读取csv文件也不适用于我 – 它以自定义格式中的3个单元格的forms导入为date(显示值为1-Sep,单元格值为9/1/2011) 剩下的单元格转换为常规。

编辑:包含以下内容的csv文件:

 "9-1",'9-2',='9-3',=''9-4'' 

读入电子表格如下:

 1-Sep '9-2' ='9-3' ="9-4" 

所以这个=没有什么好处,但是至less单引号会得到一个string,保留引号。 在Excel中有更多的知识必须帮助摆脱引号; “粘贴值”不会剥去它们。

问题是,您正在使用Excel的CSV导入器将CSV文件导入到Excel中。 我知道,不直观,但你不应该以这种方式导入CSV文件。 相反,导入他们作为文本文件(即名称与txt扩展名)。 然后,您将有机会指定每个列的types,并可以正确select“文本”作为与Exceldate类似的列。

如果你正在寻找一个交钥匙“这是一个文件,你可以在Excel中打开”的方法,请尝试xlwt (不是我的原始build议pyXLWriter ),并完全避免CSV。

如果你的目标只是在Excel上写一个列表作为表格。 你可以试试下面的例子,其中“;” 和方言=“excel-tab”属性使我们能够在彩色之间切换。

 import csv RESULTS = [ ['val_col1;','val_col2;','val_col3'] ] resultFile = open("testExcel.csv",'wb') resultWriter= csv.writer(resultFile, dialect='excel-tab') resultWriter.writerows(RESULTS) 

好的,感谢您的帮助,我提出了一个粗略的解决scheme,所以我想我会在这里分享。

这不是最漂亮的解决scheme,但它适用于我的目的。 尽pipe有一个警告:如果你的string中有任何引号,它将会中断!

 import csv import re data = [ ['9-1', '9-2', '9-3'] ] def quoteCsvData(data): for x, row in enumerate(data): for y, item in enumerate(row): if data[x][y] != '': data[x][y] = r'="' + data[x][y] + r'"' return data def unquoteCsvData(data): for x, row in enumerate(data): for y, item in enumerate(row): if data[x][y] != '': m = re.match(r'="([^"]*)"',data[x][y]) if m: data[x][y] = m.group(1) return data fd = open('test2.csv', 'wb') data = quoteCsvData(data) try: writer = csv.writer(fd, delimiter=',', quotechar='|', quoting=csv.QUOTE_NONE, escapechar='\\') writer.writerows(data) finally: fd.close() fd = open('test2.csv', 'rb') try: reader = csv.reader(fd, delimiter=',', quotechar='|', quoting=csv.QUOTE_NONE, escapechar='\\') data = [] for row in reader: data.append(row) finally: fd.close() data = unquoteCsvData(data) print data 

更新:删除垃圾邮件的空单元与大量=""

 data = [ ['9-1', '9-2', '9-3'] ] fd = open('test.csv', 'wb') for row in data: for x in row: fd.write('="{}",'.format(x)) fd.write('\n') 

尝试::

 dialect=csv.excel 

如在

 import csv csv.excel 
  • lineterminator'\ r \ n'
  • skipinitialspace False
  • 引用0
  • 定界符“,”
  • quotechar'“'
  • 双引号真实

对我来说,它是一种从未困扰我足够阅读代码的黑色艺术,但是我所做的小实验始终得到了excel(2003)的足够好的performance。