Python csv 写入器分隔符错误?

16 投票
2 回答
26722 浏览
提问于 2025-04-17 02:19

声明:我在欧洲。

根据这个页面,在欧洲,Excel 默认使用分号 ; 作为分隔符,这是为了“避免与小数点逗号发生冲突”。

现在,我有这段 Python 代码:

import csv

data = [["test", "data"], ["foo", "bar"]]
writer = csv.writer(open("data.csv", "wb"), dialect="excel")
writer.writerows(data)

这段代码应该生成这个文件:

test;data
foo;bar

但是它却使用了逗号。为什么会这样呢? locale.getdefaultlocale() 返回的是 ('nl_NL', 'cp1252')

2 个回答

8

这个 excel 方言是通过以下属性来定义的(在 Lib/csv.py 文件中,第57行):

delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\r\n'
quoting = QUOTE_MINIMAL

我没有看到任何迹象表明这和地区设置有关——因此,使用默认方言时,你总是会得到 ,

不过,这个问题很容易解决,比如:

class excel_semicolon(csv.excel):
    delimiter = ';'

writer = csv.writer(open("data.csv", "wb"), dialect=excel_semicolon)
25

这是因为csv.excel这种格式不考虑地区设置。如果你想明确使用分号作为分隔符,那么你需要直接把分隔符传给csv.open,像这样:

writer = csv.writer(open("data.csv", "wb"), delimiter=";")

或者你可以创建一个新的格式并注册它:

class excel_semicolon(csv.excel):
    delimiter = ';'
register_dialect("excel-semicolon", excel_semicolon)

无论哪种方式,你都应该测试一下浮点数是怎么写的……我怀疑它们不会按照你想要的欧洲格式来写(也就是用逗号作为小数点)。

撰写回答