我正在尝试使用真正与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,但我看不到任何能给我想要结果的变量。
答案 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
对我来说,它有点像黑色的艺术,从来没有打扰过我去阅读代码,但是我做的小实验总是得到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')