【问题标题】:Excel disregards decimal separators when working with Python generated CSV file使用 Python 生成的 CSV 文件时,Excel 忽略小数分隔符
【发布时间】:2015-09-01 21:14:58
【问题描述】:

我目前正在尝试在 python 中编写一个 csv 文件。格式如下:

1; 2.51; 12
123; 2.414; 142

编辑:我已经在我的 CSV 中获得了上述格式,所以 python 代码似乎没问题。这似乎是一个 excel 问题,可以通过更改 @chucksmash 提到的设置来解决。

但是,当我尝试使用 excel 打开生成的 csv 文件时,它无法识别小数分隔符。 2.414在excel中被视为2414。

csvfile = open('C:/Users/SUUSER/JRITraffic/Data/data.csv', 'wb')
writer = csv.writer(csvfile, delimiter=";")
writer.writerow(some_array_with_floats)

【问题讨论】:

  • 这听起来像是 Excel 配置问题。在欧洲,., 字符的使用与美国人的预期相反(例如 2.414,0 而不是 2,414.0。尝试更改语言环境:Excel change decimal separator
  • @chucksmash 这解决了问题,谢谢。如果您将其发布为答案,我可以接受。

标签: python excel csv


【解决方案1】:

您是否检查了 csv 文件是否按照您的需要正确生成?此外,尝试指定您在导入/打开文件时用于 csv 文件的分隔符。在这种情况下,它是一个分号。

【讨论】:

    【解决方案2】:

    对于python 3,我认为您上面的代码也会遇到TypeError,这可能是问题的一部分。

    我刚刚用你的 open 方法修改为“w”而不是“wb”,因为数组有浮点数而不是二进制数据。这似乎产生了您正在寻找的结果。

    csvfile = open('C:/Users/SUUSER/JRITraffic/Data/data.csv', 'w')
    

    【讨论】:

    • 并非如此,根据 csv.writer 文档“如果 csvfile 是文件对象,则必须在不同的平台上使用‘b’标志打开它。”换句话说,“b”是安全的选择,docs.python.org/2/library/csv.html#csv.writer 的所有作者示例都使用“b”,这对我来说总是很好。
    • 'w' 创建 Excel 文件,其中包含数据的行之间的空白行。使用 'wb' 可以解决此问题。
    【解决方案3】:

    一个丑陋的解决方案,如果你真的想使用; 作为分隔符:

    import csv
    import os
    
    with open('a.csv', 'wb') as csvfile:
        csvfile.write('sep=;'+ os.linesep) # new line
        writer = csv.writer(csvfile, delimiter=";")
        writer.writerow([1, 2.51, 12])
        writer.writerow([123, 2.414, 142])
    

    这将产生:

    sep=;
    1;2.51;12
    123;2.414;142
    

    Excel 可以很好地识别。

    我个人会用,作为分隔符,在这种情况下你不需要第一行,所以你基本上可以:

    import csv
    
    with open('a.csv', 'wb') as csvfile:
        writer = csv.writer(csvfile) # default delimiter is `,`
        writer.writerow([1, 2.51, 12])
        writer.writerow([123, 2.414, 142])
    

    Excel 会识别正在发生的事情。

    【讨论】:

      【解决方案4】:

      一种方法是在编写器中指定 dialect=csv.excel。例如:

      a = [[1, 2.51, 12],[123, 2.414, 142]]
      csvfile = open('data.csv', 'wb')
      writer = csv.writer(csvfile, delimiter=";", dialect=csv.excel)
      writer.writerows(a)
      csvfile.close()
      

      除非 Excel 已配置为使用分号作为其默认分隔符,否则需要使用 Data/FromText 导入 data.csv 并在“文本导入向导”步骤 2 屏幕中指定分号作为分隔符。

      csv.Dialect 为 Dialect 类提供的文档很少。有关它的更多信息,请参阅 PyMOTW 关于 Python csv 模块的“csv – Comma-separated value files”文章中的Dialects。有关 csv.writer() 的更多信息,请访问https://docs.python.org/2/library/csv.html#csv.writer

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多