【问题标题】:Why is csv.writer removing leading zeroes?为什么 csv.writer 删除前导零?
【发布时间】:2019-05-07 08:22:23
【问题描述】:

我正在尝试将数字字符串写入 CSV 文件。一些字符串有前导零,当字符串写入文件时,前导零消失。为什么会发生这种情况,我该如何预防?

示例代码:

import csv

with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    row = ("01", "02", "03")
    writer.writerow(row)

当我打开output.csv 时,已写入的值显示为1,2,3,而不是01,02,03。 我在 Windows 10 Pro 上使用 Python 2.7.9,如果这与问题相关。

编辑:看来问题出在我用 Excel 打开 CSV 文件这一事实,它试图对文件的内容做自己的事情。

【问题讨论】:

  • 您使用二进制模式有什么原因吗?另外,你用什么打开csv? Excel 会自动将值转换为数字,从而删除前导 0。我在记事本等中得到了预期的输出,但可以在 Excel 中使用包含 1->3 的单元格 A1->A3 进行复制
  • FWIW,在 Windows 上使用 Python 2.7.10 它给了我正确的输出,前导零:01,02,03 作为output.csv 的唯一行。
  • 无法复制,我的文件包含零。
  • @NickA 以二进制模式打开是使用关键字打开的替代方法:newline='',我不确定它在 2.x 中是否可用
  • @NickA 哇,什么"useless garbage"

标签: python csv


【解决方案1】:

Microsoft Excel(至少 2013 年)会将 csv 文件中的值转换为数字,如果它们是完全数字的 01,例如,为了解决这个问题,您可以强制 Excel 将值解析为字符串。

您可以使用以下内容:

row = tuple("=\"" + r + "\"" for r in row)

在每个元素前面加上 ="",有效地将其转换为 Excel 字符串。

>>> row = ("01", "02", "03")
>>> row = tuple("=\"" + r + "\"" for r in row)
>>> row
('="01"', '="02"', '="03"')

这将在 csv 中显示为 ="01",="02",="03",并被 Excel 正确解析。

当然,这只有在您的值中没有出现双引号时才有效。

【讨论】:

  • 不,没有双引号,只有数字 0-9。谢谢。
  • 我有类似的要求,但我不想在 excel 中显示双引号。应该是01, 02, 03
【解决方案2】:

既然是 Excel 解析的问题。打开文件后在 Excel 中格式化文本可能更好。

假设它是一个固定长度的值,您可以使用 =Text(cell, "000000") 对其进行格式化,其中 # of zero 是您的值的长度。

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2014-06-10
    • 2019-12-17
    • 2016-01-15
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多