使用python创建excel兼容的CSV文件?

时间:2011-11-14 16:21:35

标签: python excel csv

我正在尝试使用真正与Excel兼容的python创建一个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()

这将创建一个包含以下内容的csv文件:

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

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

09-Jan  09-Feb  09-Mar

[Grrr,谢谢Excel。说真的,引号有什么意义?]

现在,我有read elsewhere为了让Excel将字符串视为文字,它们必须以等号="Like This"作为前缀。所以我真正想要的是:

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

有没有办法在python中使用csv模块执行此操作?我猜它会涉及创建一个custom dialect,但我看不到任何能给我想要结果的变量。

6 个答案:

答案 0 :(得分:7)

FWIW,Excel 2007甚至不兼容自己。如果在空白电子表格中键入9-1,则在离开单元格后立即将其转换为1-Sep。如果将单元格格式从“常规”更改为“文本”,则可以不加改变地输入字符串文字并将其另存为.csv文件,但是当您将同一文件读入空白电子表格(使用常规格式)时,它将重新转换为日期。 / p>

Excel将文件保存为

9-1,9-2,9-3

没有引号且没有“=”符号。即使在读取csv文件之前将单元格格式设置为Text也不适合我 - 它以自定义格式的3个单元格作为日期(显示值1-Sep,单元格值9/1/2011)导入;其余的细胞都转换成一般。

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

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

将电子表格读入:

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

所以=没有任何好处,但至少单引号会得到一个字符串文字,并保留引号。在Excel中更容易知道的人将不得不帮助删除引号; “粘贴值”不会将其剥离。

答案 1 :(得分:4)

问题是您使用Excel的CSV导入程序将CSV文件导入Excel。我知道,违反直觉,但您不应该以这种方式导入CSV文件。而是将它们导入为文本文件(即带有txt扩展名的名称)。然后,您将有机会指定每列的类型,并可以为看起来像Excel的日期的列正确选择文本。

如果您正在寻找一个交钥匙“这里有一个您可以在Excel中打开的文件”方法,请尝试xlwt(不是我原来的推荐pyXLWriter)并完全避免使用CSV。

答案 2 :(得分:3)

如果您的目标只是在Excel上将列表作为表格编写。您可以尝试以下示例,其中&#34 ;;"和方言=' excel-tab'属性使我们能够在coloumns之间切换。

import csv

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

答案 3 :(得分:1)

好的,谢谢你的帮助,我想出了一个粗略的解决方案,所以我想我会在这里分享。

这不是最漂亮的解决方案,但它适用于我的目的。但是有一个警告:如果您的字符串中有任何引号,它将会中断!

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

更新:删除了包含大量=""

的空单元格的垃圾邮件

答案 4 :(得分:-1)

试::

dialect=csv.excel

,如

import csv
csv.excel 
  • lineterminator'\ r \ n'
  • skipinitialspace False
  • 引用0
  • delimiter','
  • quotechar'“'
  • doublequote True

对我来说,它有点像黑色的艺术,从来没有打扰过我去阅读代码,但是我做的小实验总是得到excel(2003)以上表现得足够好。

答案 5 :(得分:-1)

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')