【问题标题】:Python csv writer wrong separator?Python csv writer错误的分隔符?
【发布时间】:2011-11-17 10:35:40
【问题描述】:

免责声明:我在欧洲。

根据this page,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')

【问题讨论】:

  • 我不明白反对意见。这是一个相关的问题,它显示了研究工作,但解决方案并不那么明显。
  • 各种不相关的问题:您是否阅读了您引用的“本页”中的第四个解决方案?谁是此 SSV 文件的预期使用者——人还是计算机?他们会用它做什么?您是否考虑过编写 XLS 或 XLSX 文件(可以使其与语言环境无关,但要小心)?

标签: python excel csv localization


【解决方案1】:

这是因为 csv.excel 方言不支持区域设置。如果您希望显式使用分号作为分隔符,则需要将分隔符显式传递给 csv.open as

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

或创建一个新的方言并注册它

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

在任何一种情况下,您都应该测试浮点数是如何写入的......我怀疑它们不会以您想要的欧洲格式写入(以逗号作为基数)

【讨论】:

    【解决方案2】:

    excel 方言由以下属性指定(在Lib/csv.pyline 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)
    

    【讨论】:

    • 当然它很容易修复,但我假设如果 Python 包含 excel 方言它会正确实现它 =S
    • @miku:-1。在您的第二个语句之后,csv.excel.delimiter 指的是';' 而不是','。阅读@Donkopotamus 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2017-09-07
    • 2017-12-19
    相关资源
    最近更新 更多