首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用python创建与excel兼容的CSV文件?

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

Stack Overflow用户
提问于 2011-11-15 00:21:35
回答 6查看 31.5K关注 0票数 12

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

下面是我想要做的事情

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
"9-1","9-2","9-3"

当我将它加载到Excel中时,我得到以下列:

代码语言:javascript
运行
复制
09-Jan  09-Feb  09-Mar

Grrr谢谢Excel说真的,引用的意义是什么?

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

代码语言:javascript
运行
复制
="9-1",="9-2",="9-3"

有没有办法用python中的csv模块做到这一点?我猜它会涉及到创建一个custom dialect,但是我看不到任何变量可以给我想要的结果。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-15 01:40:41

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

这不是最漂亮的解决方案,但它可以满足我的目的。一个警告:如果你的字符串中有任何引号,它就会中断!

代码语言:javascript
运行
复制
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

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

票数 1
EN

Stack Overflow用户

发布于 2011-11-15 00:52:18

FWIW,Excel2007本身甚至不兼容。如果您在一个空的电子表格中键入9-1,它会在您离开单元格时立即将其转换为1-Sep。如果将单元格格式从常规更改为文本,则可以原样输入字符串文字并将其另存为.csv文件,但是当您将同一文件读取到空白电子表格(具有常规格式)中时,它将重新转换为日期。

Excel将文件另存为

代码语言:javascript
运行
复制
9-1,9-2,9-3

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

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

代码语言:javascript
运行
复制
"9-1",'9-2',='9-3',=''9-4''

读取到电子表格中的内容如下:

代码语言:javascript
运行
复制
1-Sep  '9-2'  ='9-3'  ="9-4"

所以=没有做任何好的事情,但至少单引号将得到一个字符串文字,并保留引号。在Excel中有更多知识的人必须帮助去掉引号;“粘贴值”不会去掉它们。

票数 6
EN

Stack Overflow用户

发布于 2016-05-28 06:37:48

如果您的目标只是在Excel上以表格的形式编写一个列表。您可以尝试下面的示例,其中";“和dialect='excel-tab‘属性使我们能够在列之间切换。

代码语言:javascript
运行
复制
import csv

RESULTS = [
    ['val_col1;','val_col2;','val_col3']
]
resultFile = open("testExcel.csv",'wb')
resultWriter= csv.writer(resultFile, dialect='excel-tab')
resultWriter.writerows(RESULTS)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8124606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档