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

使用python创建与excel兼容的CSV文件?,python,excel,csv,Python,Excel,Csv,我正在尝试使用python创建一个真正与Excel兼容的csv文件(如果有什么不同的话,我使用的是Excel2007) 这就是我想做的事情 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.writero

我正在尝试使用python创建一个真正与Excel兼容的csv文件(如果有什么不同的话,我使用的是Excel2007)

这就是我想做的事情

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。说真的,引用有什么意义?]

现在,为了让Excel将字符串视为文字,它们必须以等号
=”作为前缀,就像这样“
”。所以我真正想做的是:

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

python中的
csv
模块有什么方法可以做到这一点吗?我猜这将涉及到创建一个,但我看不到任何变量可以提供所需的结果。

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

如果您正在寻找“这是一个可以在Excel中打开的文件”的交钥匙方法,请尝试(不是我最初的建议)并完全避免使用CSV。

尝试:

dialect=csv.excel

import csv
csv.excel 
  • 行终止符'\r\n'
  • SkipInInitialSpace False
  • 引用0
  • 分隔符','
  • 引述
  • 双引号正确

对我来说,这是一种黑色艺术,我从来没有足够的精力去阅读代码,但我做的小实验总是得到excel(2003)要在上述格式中表现良好。

FWIW,Excel 2007甚至与自身不兼容。如果在空电子表格中键入9-1,则在您离开单元格时,它会将其转换为1-Sep。如果您将单元格格式从“常规”更改为“文本”,则可以输入字符串文字,并将其保存为.csv文件,但当您读取他将同一个文件放入一个空白的电子表格(通用格式)中,并将其重新转换为日期

Excel将文件另存为

9-1,9-2,9-3
没有引号和“=”符号。即使在读取csv文件之前将单元格格式设置为文本,对我来说也不起作用-它以日期(显示值1-Sep,单元格值9/1/2011)导入,3个单元格采用自定义格式;其余单元格转换为常规格式

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

"9-1",'9-2',='9-3',=''9-4''
在电子表格中读取如下内容:

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

因此,
=
没有任何好处,但至少单引号将获得一个字符串文字,保留引号。Excel中更熟悉的人必须帮助清除引号;“粘贴值”“不要剥掉它们。

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

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')
这不是最漂亮的解决方案,但它符合我的目的。不过有一个警告:如果字符串中有引号,它将中断

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

更新:如果您的目标只是在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)

这与
方言class='excel'
完全相同,也就是说,不是OP想要的。谢谢。我将文件扩展名改为.txt,这迫使Excel启动文本导入器向导。但是,我必须单独选择每一列并选择作为文本导入(无法选择多个列)。对于100个列,这对我来说不是一个真正可用的解决方案:-(你可以选择多个列,并在步骤3中用Shift键同时更改它们。哦,是的。它现在正在工作……我想我一定已经尝试过CTRL而不是Shift。谢谢你也可以把XLWT作为另一种方式来直接从Python写Excel文件,这是可以的,因为它在两个项目上对我来说相当不错。-PyxLWRI的1。这就像挪威蓝鹦鹉一样。尽管sourceforge本周显示了12次下载。是你造成的吗?它没有被维护(上次更新:6年前),编写Excel 5/7 XLS文件,而且有缺陷。是的,Excel很烂。我甚至不会使用它,除非我工作场所的一些人坚持使用它来查看数据。问题不是让Python编写文件,而是让Excel在不损坏数据的情况下读取.csv文件。