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